我需要一点AR查询帮助。这就是我的模型的样子:
class User < AR:B
has_many :publications
end
class Publication < AR:B
belongs_to :user
belongs_to :category
end
class Category < AR:B
has_many :publications
end
现在假设我想迭代所有现有类别,并显示用户的出版物,或者显示类似“#{current_user.name}此类别中没有出版物”的内容。
class PublicationsController < AC:B
def index
@categories = Category.find(:all, :include => :publications, :conditions => { 'publications.user_id' => current_user })
end
end
这为我提供了用户实际拥有出版物的所有类别,但缺少“空”的类别。
有什么建议吗? : - )
答案 0 :(得分:0)
这为您提供了所有类别对象:
@categories = Category.all
然后,如果您通过关联声明has_many:您可以执行以下操作:
@categories.each do |category|
if category.users.include?(current_user)
# User has publications
publications = category.publications.select { |pub| pub.user == current_user }
else
# User has no publications
end
end
(has-many-through声明:
class User < AR:B
has_many :publications
has_many :categories, :through => :publication
end
class Publication < AR:B
belongs_to :user
belongs_to :category
end
class Category < AR:B
has_many :publications
has_many :users, :through => :publication
end
...警告:drycode)
尽管如此,使用命名范围可能还有一种更简洁的方法。
答案 1 :(得分:0)
您可以只修改查找呼叫:
@categories = Category.find(:all, :include => :publications, :conditions => [ 'publications.user_id=? OR publications.user_id IS NULL', current_user ])
请注意,我们在此使用Array变体而不是Hash变体,因为文档中的示例暗示这是正确的用法。