1

我有一个属于用户的更新模型。为了显示一个用户的所有朋友的更新,我正在做类似的事情:

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" => @friendarray) 。但显然我在这里以一种非常老套的方式做事。我有点困惑 Rails 何时可以从视图中的模型和方法中“看到”某些变量。插入一组 ID 以查找其更新的最佳方法是什么,因为我不应该在视图本身中使用太多逻辑?

4

2 回答 2

2

Mattharick 关于使用关联是正确的。您应该对您在问题描述中提到的问题使用关联。如果我们在您的问题标题中提出问题;

假设你有一个User模型。

这两种方法是不同的:

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

另一个是:

def testing
  puts "I'm testing"
end

注意self关键词。self关键字使方法成为类方法。您可以从控制器或视图中调用它,例如:User.testing.

但是没有测试的是实例方法。可以这样称呼:

u = User.last
u.testing

第二个使您可以在模型中使用“实例”的属性。

例如,您可以name像这样在该方法中显示您的实例?

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

这些都是强大的东西。

在他们身上练习。

于 2013-08-10T20:26:45.237 回答
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 数组。

于 2013-08-13T07:46:21.850 回答