Ruby on rails 从Rails中的关联加载命名的_作用域

Ruby on rails 从Rails中的关联加载命名的_作用域,ruby-on-rails,Ruby On Rails,有没有办法从关联中加载命名的\u作用域 我有我的文章模型: class Article < ActiveRecord::Base has_many :comments end 我怎样才能做同样的事情,但只针对批准的评论?目前它不是rails内置的,但是Ryan Daigle创建了一个名为utility_scopes的插件,它添加了一个with()作用域,以便您可以执行以下操作: Article.approved.with(:comments) 博文: Github回购: [根据评

有没有办法从关联中加载命名的\u作用域

我有我的文章模型:

class Article < ActiveRecord::Base
  has_many :comments
end
我怎样才能做同样的事情,但只针对批准的评论?

目前它不是rails内置的,但是Ryan Daigle创建了一个名为utility_scopes的插件,它添加了一个with()作用域,以便您可以执行以下操作:

Article.approved.with(:comments)
博文: Github回购:

[根据评论更新]

我的错。我读得不够好。我不认为有任何东西可以让你调用一个名为_scope的关联。我能想到的最接近的事情是在文章中创建一个命名的_范围:

class Article < ActiveRecord::Base
   named_scope :with_approved_comments, {:include => :comments, :conditions => ['comments.approved = ?', true]}
end
类文章:comments,:conditions=>['comments.approved=?',true]}
结束

希望这有帮助。

另一个答案对我不起作用,因为我必须在一些模型上加载许多关联以及这些关联的关联。我发现我有两个选择,将关联更改为have conditions,从而为我想要的每个作用域建立关联,或者将它们转换为具有has_many关联的类上的方法。我需要按照以下思路做一些事情:

@newspaper = Newspaper.find params[:id], :include => {
  :articles => {
    :author => true,
    :source => true
  }
}
所以在我的例子中,我改变了:

class Newspaper < ActiveRecord::Base
  has_many :articles
end

class Article
  belongs_to :newspaper
  belongs_to :author
  has_one :source

  named_scope :private, :conditions => { :private => true }
  named_scope :public, :conditions => { :private => false }
end

在我需要所有相关文章的情况下,我必须急切地加载这两篇文章。

如果我正确理解了博客文章,这将为我提供范围明确的文章及其所有评论。它相当于:Article.approved.all(:include=>:comments)。我所寻找的是确定评论的范围,这样每篇文章只加载其批准的评论,而不是所有评论。
@newspaper = Newspaper.find params[:id], :include => {
  :articles => {
    :author => true,
    :source => true
  }
}
class Newspaper < ActiveRecord::Base
  has_many :articles
end

class Article
  belongs_to :newspaper
  belongs_to :author
  has_one :source

  named_scope :private, :conditions => { :private => true }
  named_scope :public, :conditions => { :private => false }
end
class Newspaper < ActiveRecord::Base
  has_many :articles

  def articles_public
    articles.reject &:private
  end

  def articles_private
    articles.select &:private
  end
end

class Article
  belongs_to :newspaper
  belongs_to :author
  has_one :source
end
has_many :articles_private, :class_name => 'Article', :conditions {:private => true}
has_many :articles_public, :class_name => 'Article', :conditions {:private => false}