使用模型中的方法,从视图中调用它

时间:2013-08-10 20:15:09

标签: ruby-on-rails methods rails-models

我有一个属于用户的更新模型。 要显示所有用户的朋友的更新,我正在执行以下操作:

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数组以查找其更新的最佳方法是什么,因为我不应该在视图本身中使用太多逻辑?

2 个答案:

答案 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数组..