【发布时间】:2013-04-11 22:39:54
【问题描述】:
我正在学习 Rails 中的范围,但在定义一些范围时遇到了一些麻烦。假设我有以下模型..
class Category < ActiveRecord::Base
has_many :posts
has_many :comments, :through => :post
end
class Post < ActiveRecord::Base
belongs_to :category
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
has_many :categories, :through => :post
# attribute: owner
end
注意 Comment 的属性所有者。我正在尝试编写一个范围,它将返回只有我通过的所有者制作的 cmets 的类别。因此,如果一个类别有 cmets,并且这些 cmets 是由其他几个所有者制作的,则不应包括这些。我有这个工作。我得到的类别有我通过的所有者的 cmets..但我也得到了其他所有者的有 cmets 的类别。
在我的类别模型中,我有这个..
scope :comments_by_owner, lambda { |name| joins(:comments).where("comments.owner = ?", name) }
我使用
拨打电话Category.comments_by_owner("tom")
我尝试过使用 joins 和 uniq 但没有运气..
【问题讨论】:
-
所以您想要只包含指定所有者的 cmets 的类别?
-
是的@Fred 没错。抱歉,直到现在我才看到您的评论。
-
我可以看到如何在 arel 的数组上使用 Array#select 来做到这一点,但我不太确定如何覆盖 ActiveRecord 的选择,所以我不愿意提供代码。基本上,我会遍历 Category 记录,并且对于每一个记录,运行 cmets,如果我发现有 comment.name != name 的评论则拒绝该类别。剩下的就是您的单个评论者类别。
标签: ruby-on-rails