我试图通过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,并从给定的位置获取Contacts创建的所有Dialog ...类似于:
Dialog.from_location(Location.first.id)
我可以使用select:
获得所需结果的非activerecord数组Dialog.all.select{|s| s.contact.location_id == Location.first.id }
但是我需要这个来返回一个activerecord数组,以便可以在结果上调用其他范围或类方法。我尝试过使用连接和包含,但在阅读有关如何使用它们的rails指南后感到困惑。
任何人都可以帮我弄清楚如何构建一个可以实现此目的的范围或类方法吗?
提前致谢
答案 0 :(得分:1)
只需在您接受的答案中添加注释,引用rails指南网站上的红宝石:
使用类方法是接受范围参数的首选方法。仍然可以在关联对象(link)
上访问这些方法
所以在你的情况下,不要用参数做一个范围,而是定义一个方法:
class Contact < ActiveRecord::Base
has_many :dialogs
belongs_to :location
def self.from_location(id)
where(location_id: id)
end
end
答案 1 :(得分:0)
您可以按如下方式定义范围:
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