Имя отношения в таблице в середине.

уйста, помогите мне в понимании:source вариантhas_one/has_many :through ассоциация. Объяснение Rails API для меня мало что значит.

"Указывает имя ассоциации источника, используемоеhas_many :through => :queries, Используйте его, только если имя не может быть выведено из ассоциации.has_many :subscribers, :through => :subscriptions будет искать либо:subscribers или же:subscriber наSubscription, если только:source дано. "

Ответы на вопрос(3)

Решение Вопроса

имя, которое вы хотите использовать для ассоциации в модели, не совпадает с именем в:through модель, вы можете использовать:source указать это.

Я не думаю, что приведенный выше абзацмного понятнее, чем в документах, вот пример. Давайте предположим, что у нас есть три модели,Pet, Dog а такжеDog::Breed.

class Pet < ActiveRecord::Base
  has_many :dogs
end

class Dog < ActiveRecord::Base
  belongs_to :pet
  has_many :breeds
end

class Dog::Breed < ActiveRecord::Base
  belongs_to :dog
end

В этом случае мы выбрали пространство именDog::Breedпотому что мы хотим получить доступDog.find(123).breeds как приятное и удобное объединение.

Теперь, если мы теперь хотим создатьhas_many :dog_breeds, :through => :dogs ассоциация поPetУ нас вдруг возникла проблема. Rails не сможет найти:dog_breeds ассоциация поDogтак что Rails не может знатькоторый Dog ассоциация, которую вы хотите использовать. Войти:source:

class Pet < ActiveRecord::Base
  has_many :dogs
  has_many :dog_breeds, :through => :dogs, :source => :breeds
end

С участием:sourceмы говорим Railsискать ассоциацию под названием:breeds наDog модель (так как эта модель используется для:dogs), и используйте это.

 Jwan62210 нояб. 2017 г., 17:36
«В этом случае мы выбрали пространство имен Dog :: Breed, потому что хотим получить доступ к Dog.find (123) .breeds как к удобной и удобной ассоциации». Вам не нужно пространство имен для этого?
 Anton Semenichenko18 сент. 2018 г., 15:04
Большое спасибо !!
 LazerSharks30 дек. 2014 г., 23:22
В приведенном выше примере, если ассоциация подDog бытьhas_many :breed вместо:breeds а затем:source быть:breed единственное, чтобы представить название модели, а не:breeds который представляет имя таблицы? Например.has_many :dog_breeds, :through => :dogs, :source => :breed (нетs суффиксов:breed)?
 Anwar18 окт. 2015 г., 16:02
Я проверял это. это единственное число, нетs суффикс в:source =>
 Kamilski8129 февр. 2012 г., 15:26
Я думаю, что вы хотели, чтобы ваш последний класс Animal был назван классом Pet, просто опечатка, я верю.

Позвольте мне расширить этот пример:

class User
  has_many :subscriptions
  has_many :newsletters, :through => :subscriptions
end

class Newsletter
  has_many :subscriptions
  has_many :users, :through => :subscriptions
end

class Subscription
  belongs_to :newsletter
  belongs_to :user
end

С помощью этого кода вы можете сделать что-то вродеNewsletter.find(id).users получить список подписчиков рассылки. Но если вы хотите быть более понятным и иметь возможность печататьNewsletter.find(id).subscribers вместо этого вы должны изменить класс Newsletter на этот:

class Newsletter
  has_many :subscriptions
  has_many :subscribers, :through => :subscriptions, :source => :user
end

Вы переименовываетеusers ассоциация сsubscribers, Если вы не предоставите:sourceRails будет искать ассоциацию под названиемsubscriber в классе подписки. Вы должны сказать это, чтобы использоватьuser объединение в классе подписки, чтобы составить список подписчиков.

 Anwar18 окт. 2015 г., 16:04
обратите внимание, что имена моделей в единственном числе должны использоваться в:source =>, а не во множественном числе. Так,:users неправильно,:user правильно
 Brian Joseph Spinos30 окт. 2017 г., 01:53
Это лучший ответ! Позвольте мне подчеркнуть эту часть: «Вы переименовываете ассоциацию пользователей в подписчики. Если вы не предоставите: source, Rails будет искать ассоциацию, называемую подписчиком, в классе Subscription».
 Anwar20 сент. 2015 г., 20:08
Благодарю. Намного понятнее

Имя отношения в таблице в середине.

Ваш ответ на вопрос