是否有可能在self.posts.find中超越自我?

时间:2009-05-23 23:23:46

标签: ruby-on-rails model find self

在下面的recent_posts_on_self上展开,我想添加一个all_recent_posts_on_self方法,但我不确定是否可能使用语法self.posts.find 。另一方面,all_recent_posts_on_class似乎很简单。

class User < ActiveRecord::Base
  has_many :posts, :class_name => "Post" , :foreign_key => "author_id"
  has_many :comments, :class_name => "Comment", :foreign_key => "author_id"

  def recent_posts_on_class
    Post.find(  :all, :conditions => ['author_id = ?', self.id],
                :order => 'created_at asc', :limit => 5)
  end

  def recent_posts_on_self
    self.posts.find(:all, :order => 'created_at ASC', :limit => 5)
  end
end

在上面的示例中,我有两种方法可以找到与用户关联的最新博客帖子。我可以调用Post.find并将其传递给author_id,或者我可以调用self.posts.find,我不需要传递作者ID。我假设这是因为在后一种情况下,self.posts已经基于用户对象的主键和与该用户关联的has_many:posts受到限制。在这种情况下这是一个优点,因为我不需要将author_id作为参数传递。但如果我不需要通过作者限制查询,是否可以创建一个all_recent_posts_on_self来执行此操作?

我所说的是与此方法相当的(省略了:条件):

  def all_recent_posts_on_class
    Post.find(:all, :order => 'created_at asc', :limit => 5)
  end

但是使用self.posts.find而不是Post.find

  def all_recent_posts_on_self
    self.posts.find(...)
  end

此外:

即使可以使用self.posts.find来执行此操作,使用Post.find会“更好”吗?

2 个答案:

答案 0 :(得分:4)

这不完全是你提出的问题,但我认为这有助于了解和遵循常见模式有助于避免复杂或混乱的实现。

执行此操作的“Rails方法”是使用命名范围:

class Post < ActiveRecord::Base
  belongs_to :user
  named_scope :recent, :order => 'created_at desc', :limit => 5
end

class User < ActiveRecord::Base
  has_many :posts
end

它没有比这更具说服性和易读性:

user.posts.recent # 5 most recent posts by the user
Post.recent # 5 most recent posts globally

答案 1 :(得分:1)

我不确定你为什么要使用self.posts.find(..)来寻找其他作者的帖子。这个习惯用于专门用于查找与特定实例相关联的对象的子集。

当您不希望限制特定用户模型时,应该使用Post.find()。毕竟,User对象上的posts()方法只是一个方便,实际上与对Post.find(:all,:conditions =&gt; ['author_id',self.id]的(缓存)调用相同)