在下面的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会“更好”吗?
答案 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]的(缓存)调用相同)