rails 4范围通过多个has_one关联

时间:2014-09-10 21:39:14

标签: ruby-on-rails activerecord scope

我试图通过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指南后感到困惑。

任何人都可以帮我弄清楚如何构建一个可以实现此目的的范围或类方法吗?

提前致谢

2 个答案:

答案 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