我试图通过四层(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,但是它没有成功使它工作。任何帮助将不胜感激!谢谢!
答案 0 :(得分:0)
看起来你很困惑包括加入。包含用于预加载数据以节省查询。连接的使用方式与普通的SQL语句连接一样,可以按相关标准进行过滤。
首先,我将此添加到您的ProviderLicense模型(这使您可以更轻松地使用多对多关系):
has_many :specialties, :through => :provider_specialties
我真的不知道你想要实现什么样的查询,但也许这会有所帮助?
Provider.joins({:provider_licenses => [:specialties]}).where('specialties.id = ?', specialty_id)
您应该在生成的SQL查询中查看开发日志,然后从那里进行调整。
我还没有测试过我的代码,因此语法可能略有不同。