Делегировать ассоциацию - PullRequest
       2

Делегировать ассоциацию

0 голосов
/ 18 сентября 2018

У меня есть модель A, у которой есть много другой модели B, которая имеет_множество третьей модели C, и хочу делегировать A из B в C. Например:

class House < ApplicationRecord
  has_many :pets
end

class Pet < ApplicationRecord
  belongs_to :house
  has_many :toys
  delegate :house, to: :toys
end

class Toy < ApplicationRecord
  belongs_to :pet
end

> toy.house

В нынешнем виде я должен использовать toy.pet.house

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы можете использовать опцию :through в ваших ассоциациях ActiveRecord, чтобы выполнить то, что вы хотите.Настройте ваши модели следующим образом:

class House < ApplicationRecord
  has_many :pets
  has_many :toys, through: :pets
end

class Pet < ApplicationRecord
  belongs_to :house
  has_many :toys
end

class Toy < ApplicationRecord
  belongs_to :pet
  has_one :house, through: :pet
end

Вот ссылка на официальное руководство для опции : through для ассоциаций has_many и has_one.

0 голосов
/ 18 сентября 2018

Попробуйте

class Toy < ApplicationRecord
  belongs_to :pet 
  delegate :house, to: :pet 
end

И удалите

delegate :house, to: :toys 

из Pet.

Есть как минимум две проблемы с:

class Pet < ApplicationRecord
  belongs_to :house
  has_many :toys
  delegate :house, to: :toys
end

Во-первых, экземпляр Toy не отвечает на house, поэтому вы не можете delegate :house, to: :toys.Во-вторых, даже если экземпляр Toy действительно ответил на house, вы не сможете вызвать этот метод экземпляра в коллекции, каковым является toys.Итак, это разорилось повсюду.

Pet, однако отвечает на house.И, Toy belongs_to :pet.Итак, вы делаете Toy delegate :house, to: :pet.А Боб твой дядя!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...