Rails在包含(:children)

时间:2015-09-17 09:31:31

标签: ruby-on-rails

模型

class User
  has_many :pictures

class Picture 
  belongs_to User
  mount_uploader :picture, UserPictureUploader
  def self.profile
    find_by(is_profile: true)
  end

控制器

User.includes(:pictures).where(...

查看

=user.pictures.profile.picture_url

这导致以下问题,即将再次查询每张图片。 如果我们使用user.pictures.where(profile: true).picture_url,它将不会进行任何新的SQL查询。

问题:

我们如何在已包含的结果中使用范围?

2 个答案:

答案 0 :(得分:0)

如下所示

class User
  has_many :pictures
  scope :some_name, -> { includes(:pictures).where(your_query_here) }
end

此外,scopes仅用于Class(换言之,它们是class methods),如果您想在instance上使用它,那么您需要定义类似下面的实例方法

class User
  has_many :pictures

  def some_name
    self.includes(:pictures).where(your_query_here)
  end
end

答案 1 :(得分:0)

经过一番挖掘,我发现了这个问题

What is the equivalent of the has_many 'conditions' option in Rails 4?

看起来你可以把你的has_many关系的条件基本上放在你正在寻找的范围配置上。这有点像:

has_many :old_pictures, :class_name => 'Picture', 
         :foreign_key => 'picture_id', -> { where('created_at < ?', Time.now - 7.days) }