繁体   English   中英

通过多个has_one关联的Rails 4作用域

[英]rails 4 scope through multiple has_one associations

我正在尝试通过2层has_one关联来获得activerecord关联,并且无法完全弄清楚。

我有3种型号:

class Dialog < ActiveRecord::Base
  belongs_to :contact
end

class Contact < ActiveRecord::Base
  has_many :dialogs
  belongs_to :location
end

class Location < ActiveRecord::Base
  has_many :contacts
end

我想在Dialog模型中创建一个范围,该范围使我可以传递Location的ID并从给定的Location获取由Contacts创建的所有Dialog ...类似于:

Dialog.from_location(Location.first.id)

我可以使用select获得所需结果的非activerecord数组:

Dialog.all.select{|s| s.contact.location_id == Location.first.id }

但是我需要它返回一个activerecord数组,以便可以在结果上调用其他作用域或类方法。 我曾尝试使用联接和包含,但在阅读了有关如何使用它们的Rails指南后感到困惑。

谁能帮我弄清楚如何构造一个可以实现此目标的范围或类方法?

提前致谢

只需在您接受的答案上添加注释,并引用Rails指南网站上的ruby:

使用类方法是接受范围参数的首选方法。 这些方法仍然可以在关联对象上访问( 链接

因此,在您的情况下,不要定义参数范围,而要定义一个方法:

class Contact < ActiveRecord::Base
  has_many :dialogs
  belongs_to :location

  def self.from_location(id)
    where(location_id: id)
  end
end

您可以如下定义范围:

class Dialog < ActiveRecord::Base
  belongs_to :contact

  scope :from_location, -> (id) do 
    where(contact_id: Contact.from_location(id).select(:id))
  end
end

class Contact < ActiveRecord::Base
  has_many :dialogs
  belongs_to :location

  scope :from_location, ->(id) do
    where(location_id: id)
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM