好吧,我觉得我现在已经开始为我现在要编写的每个活动记录查询而来,我开始拖出我的用户/宠物/寄生虫比喻,但我们又来了。
在以下设置中;
class User < ActiveRecord::Base
has_many :pets
has_many :parasites, :through => :pets
end
class Pet < ActiveRecord::Base
has_many :parasites
belongs_to :user
end
class Parasite < ActiveRecord::Base
belongs_to :pet
end
我想写一个搜索,它将返回属于Bob猫的所有寄生虫(即User.name ='Bob'和Pet.animal ='Cat')。
我意识到我可以用相当抽出和丑陋的
来做到这一点User.where(:name => 'Bob').first.pets.where(:animal => 'Cat').first.parasites
但我认为应该有更简洁的方法来做到这一点。
我尝试编写连接语句以实现此操作会导致ActiveRecord :: Configuration错误,因此我怀疑我会向后推进此操作。再一次,这似乎应该比它更容易。
感谢。
答案 0 :(得分:2)
您尝试实现has_many through has_many
关联。使用Rail的热切加载协会无法实现这一点。
你要做的是:
users
pets
users
向下username
pets
向下user_id
和animal
字段在ActiveRecord中:
Parasite.joins(:pet).joins('INNER JOIN users').where('users.name = ? AND pets.user_id = users.id AND pets.animal = ?', @username, @animal)
或者,您可以创建命名范围:
class Parasite < ActiveRecord::Base
belongs_to :pet
scope :parasites_of, lambda {|owner, animal_type| joins(:pet).joins('INNER JOIN users').where('users.name = ? AND pets.user_id = users.id AND pets.animal = ?', owner, animal_type) }
end
现在您可以致电Parasite.parasites_of('Bob', 'Cat')
生成的SQL查询如下所示:
SELECT * FROM parasites
INNER JOIN users,
INNER JOIN pets ON pets.id = parasites.pet_id
WHERE
users.name = 'Bob'
AND
pets.user_id = users.id
AND
pets.animal = 'Cat'
(提示:.to_sql
方法将向您显示纯SQL查询)