使用Model.where(...)的Rails中的复杂查询。包括(...)

时间:2011-09-18 07:00:17

标签: sql ruby-on-rails include

我试图通过四层(yikes!)查询关联。协会如下:

(编辑:添加了关联详细信息,我在源代码中已将它们包含在内但未在此处包含它们)

Provider
   has_many :specialties, :through => :provider_specialties
   has_many :provider_specialties, :through => :provider_licenses
   has_many :provider_licenses

ProviderLicense
  belongs_to :provider
  has_many :specialties, :through => :provider_specialties
  has_many :provider_specialties

#linking model between ProviderLicense and Specialty
ProviderSpecialty
  belongs_to :provider_license
  belongs_to :specialty

Specialty
  has_many :provider_specialties

我的出发点是瑞安贝茨的RailsCast。我已经成功地搜索了一层深层的关联对象,但是这个对我来说已经过去了。

providers = Provider.includes([:provider_languages, { :provider_licenses => :provider_specialties }]).where(conditions)

def specialties_and_conditions
  ["providers_specialties.specialty_id = ?", specialty_id] unless specialty_id.blank?
end

(编辑:下面的工作查询和连接)

Provider.joins([:specialties => { :provider_licenses => :provider_specialties }]).where(conditions)

def specialties_and_conditions
  ["specialty_id = ?", specialty_id] unless specialty_id.blank?
end

我真的不明白“包含”方法是如何工作的。我试图在上面的代码中搜索ProviderSpecialty(链接)关系中的specialty_id,但是它没有成功使它工作。任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

看起来你很困惑包括加入。包含用于预加载数据以节省查询。连接的使用方式与普通的SQL语句连接一样,可以按相关标准进行过滤。

首先,我将此添加到您的ProviderLicense模型(这使您可以更轻松地使用多对多关系):

has_many :specialties, :through => :provider_specialties

我真的不知道你想要实现什么样的查询,但也许这会有所帮助?

Provider.joins({:provider_licenses => [:specialties]}).where('specialties.id = ?', specialty_id)

您应该在生成的SQL查询中查看开发日志,然后从那里进行调整。

我还没有测试过我的代码,因此语法可能略有不同。