Using a method within model, calling it from view

淺唱寂寞╮ 提交于 2019-12-23 02:49:29

问题


I have an Update model which belongs to users. To show all of one user's friends' Updates, I am doing something like:

Update.where("user_id" => [array_of_friend_ids])

I know the "right" way of doing things is to create a method to create the above array. I started writing the method but it's only half-working. Currently I have this in my user model:

  def self.findfriends(id)
    @friendarray = []
    @registered_friends = Friend.where("user_id" => id)
    @registered_friends.each do |x|
      @friendarray << x.friend_id
    end 
    return @friendarray
  end 

I am doing the entire action in the view with:

<% @friendinsert = User.findfriends(current_user.id) %>
<% @friendarray  = [] %>
<% @friendarray << @friendinsert %>
<%= @friendarray.flatten! %>

Then I'm calling Update.where("user_id" => @friendarray) which works. But obviously I'm doing things in a very hacky way here. I'm a bit confused as to when Rails can "see" certain variables from models and methods in the view. What's the best way to go about inserting an array of IDs to find their Updates, since I'm not supposed to use much logic in the view itself?


回答1:


Mattharick is right about using associations. You should use associations for the question you mentioned in description of your question. If we come to the question at the title of your question;

let's say you have a User model.

These two methods are different:

def self.testing
  puts "I'm testing"
end

and the other one is:

def testing
  puts "I'm testing"
end

Pay attention to the self keyword. self keyword makes method a Class method. Which you can call it from your controllers or views like: User.testing.

But the one with out testing is a instance method. Which can be called like:

u = User.last
u.testing

Second one gives you possibility to use attributes of the 'instance' inside your model.

For example, you can show name of your instance in that method just like this?

def testing
  puts "Look, I'm showing this instance's name which is: #{name}"
end

These are powerful stuff.

Practise on them.




回答2:


Simple add another association to your project.

class User < ActiveRecord::Base

  has_many :friendship
  has_many :friends, :through => :friendship, :class_name => User, :foreign_key => :friend_id

  has_many :friendship
  has_many :users, :through => :friendship

end

class Friendship < ActiveRecord::Base

  belongs_to :user
  belongs_to :friend, :class_name => User

end

I don't know if my synrax is correct, please try out.

Friendship has the attributes user_id and friend_id.

After that you should be able to do something like following to get the updates of a friend:

User.last.friends.last.updates

You can work with normal active record queries instead of hacky arrays..



来源:https://stackoverflow.com/questions/18165948/using-a-method-within-model-calling-it-from-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!