如何找到属于特定用户特定宠物的所有寄生虫?

时间:2011-07-28 23:34:37

标签: ruby-on-rails ruby-on-rails-3 activerecord

好吧,我觉得我现在已经开始为我现在要编写的每个活动记录查询而来,我开始拖出我的用户/宠物/寄生虫比喻,但我们又来了。

在以下设置中;

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错误,因此我怀疑我会向后推进此操作。再一次,这似乎应该比它更容易。

感谢。

1 个答案:

答案 0 :(得分:2)

您尝试实现has_many through has_many关联。使用Rail的热切加载协会无法实现这一点。

你要做的是:

  • 加入users
  • 加入pets
  • 范围users向下username
  • 范围pets向下user_idanimal字段

在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查询)