我有一个属于用户的更新模型。 要显示所有用户的朋友的更新,我正在执行以下操作:
Update.where("user_id" => [array_of_friend_ids])
我知道“正确”的做事方式是创建一个方法来创建上面的数组。我开始编写方法,但它只是半工作。目前我在我的用户模型中有这个:
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
我正在视图中执行整个操作:
<% @friendinsert = User.findfriends(current_user.id) %>
<% @friendarray = [] %>
<% @friendarray << @friendinsert %>
<%= @friendarray.flatten! %>
然后我正在调用Update.where(“user_id”=&gt; @friendarray)。但显然我在这里以非常黑客的方式做事。当Rails可以从视图中的模型和方法“看到”某些变量时,我有点困惑。插入ID数组以查找其更新的最佳方法是什么,因为我不应该在视图本身中使用太多逻辑?
答案 0 :(得分:2)
Mattharick关于使用协会是正确的。您应该在问题描述中使用关联来解决您提到的问题。如果我们在问题的标题处提出问题;
假设你有一个User
型号。
这两种方法不同:
def self.testing
puts "I'm testing"
end
另一个是:
def testing
puts "I'm testing"
end
请注意self
关键字。 self
关键字使方法成为Class方法。您可以从控制器或视图中调用它,例如:User.testing
。
但是没有测试的是实例方法。可以这样称呼:
u = User.last
u.testing
第二个使您可以在模型中使用“实例”的属性。
例如,您可以像这样在该方法中显示实例的name
吗?
def testing
puts "Look, I'm showing this instance's name which is: #{name}"
end
这些都很有用。
练习它们。
答案 1 :(得分:1)
简单地为您的项目添加另一个关联。
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
我不知道我的synrax是否正确,请试试。
友谊的属性为user_id和friend_id。
之后,您应该能够执行以下操作以获取朋友的更新:
User.last.friends.last.updates
您可以使用普通的活动记录查询而不是hacky数组..