私はマイナーな編集とモデルの関係を定式化し、これで終わった:
class Person < ActiveRecord::Base
has_many :pets
attr_accessor :primary_pet
end
class Pet < ActiveRecord::Base
belongs_to :person
belongs_to :breed
end
class Breed < ActiveRecord::Base
# no belonging relationship
attr_accessor :name
end
私は(それが実際に働いていた)を思い付いた最高のクエリは、このでした:
Person.joins(pets: :breed).where(breeds: { name: 'Norwich Terrier' }).where("people.primary_pet = pets.id")
これはpets
ためとbreeds
に関係に参加することを言います。これにより、breeds
構造体を使用して 'Norwich Terrier'をフィルタリングすることができます。それを終えて、pets.idに関連するprimary_pet_idでさらにフィルタリングします。
これは、あなたが質問で求めたものを得るはずです。ここで
は、私はそれをテスト方法は次のとおりです。
breed_names = ["Beagle", "Collie", "Norwich Terrier", "German Shepard", "Dachshund"]
people_names = ["Barbara", "Connie", "Paula", "Gerald", "Dave"]
# Add breeds
breed_names.each {|name| Breed.create!(name: name) }
# Add people
people_names.each {|name| Person.create!(name: name) }
# Add some pets
people_names.each do |name|
person = Person.find_by(name: name)
breed_names.sample(3).each do |breed|
breed = Breed.find_by(name: breed_name)
Pet.create!(breed_id: breed.id, person_id: person.id)
end
end
# Assign the primary_pet for each person
Person.all.each {|person| pet = person.pets.first ; person.update!(primary_pet: pet) if pet }
# List all people and their pets by breed
Person.all.each do |person|
puts "#{person.name}: #{person.pets.map {|pet| pet.breed.name}}"
end
# List all people and their primary pet breed
Person.all.each do |person|
puts "#{person.name}: #{person.primary_pet ? person.primary_pet.breed.name : ''}"
end
# Run the query
Person.joins(pets: :breed).where(breeds: { name: 'Norwich Terrier' }).where("people.primary_pet = pets.id")
これは、トリックを行います: 'Person.includes(ペット:犬種).where(品種:{名: 'ノーリッチ・テリア'})' – MrYoshiji
HTTPSを: //thoughtbot.com/upcase/videos/advanced-querying-belongs-to –