2013-01-15 35 views
0

我有这个疑问如预期那样工作查询:Rails的.joins在多个协会

@dog.listings.joins(:address_country).merge(Country.where(permalink: 'uk'))

该查询给了我在国家“UK”相匹配的信息(清单HAS_ONE:ADDRESS_COUNTRY,这是一个从国家模范国家)

但是,当我在猫和上市(屑)之间添加一个关联的链条,这是行不通的(一个垃圾属于上市,以及一只猫):

@dog.litters.joins(:listing) & Listing.joins(:address_country) & Country.where(permalink: 'uk')

在此查询中,我希望它获取Litters所在的国家/地区(相关列表的匹配项)。但它只是返回一个空数组。 ?第一次查询的工作,我想我只需要螺栓上,以@cat.litters

在Rails C,我得到这个:

d.litters.joins(:listing) & Listing.joins(:address_country).merge(Country.where(permalink: 'uk')) 

    Litter Load (0.6ms) SELECT "litters".* FROM "litters" INNER JOIN "listings" ON "listings"."id" = "litters"."listing_id" WHERE "litters"."litterable_id" = 11 AND "litters"."litterable_type" = 'Dog' 
    Listing Load (0.4ms) SELECT "listings".* FROM "listings" INNER JOIN "countries" ON "countries"."id" = "listings"."address_country_id" WHERE "countries"."permalink" = 'uk' 
=> [] 

任何想法我做错了吗?

回答

1

有一点肯定是错误的,假设&是与merge相同。它曾经是但在fbd917被删除 - 现在它只是ruby's array intersection,这不是你想要的。

我不知道我遵循你给的简要描述数据库架构,但只是将其重写合并是值得出手:

@dog.litters.joins(:listing).merge(Listing.joins(:address_country)).merge(Country.where(permalink: 'uk')) 

,再而无需实际运行的代码,我猜想,这是相当于:

@dog.litters.joins(listing: :address_country).where(countries: {permalink: "uk"}) 
+0

嗨Jiří,感谢您的回答!有趣的是,第一个例子不起作用(说'没有找到名为'address_country'的协会'),但第二个例子确实:-)任何想法,为什么?我很高兴你提到了关于合并的问题,我看到Railscast说它们是一样的(但是它在更老的演员阵营中)。似乎没有很多书籍或文章涵盖这些类型的连接/查询,您能推荐任何资源,我可以详细了解它们吗? (我是一个SQL初学者)。再次感谢你的帮助! – A4J

+0

不知道,我将不得不在调音台中进行调查...至于资源,这是一个必须阅读http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html –

+0

谢谢:)我在10分钟内订购了Sams Teach Yourself SQL。 – A4J