Подтвердить что ты не робот

Нужна помощь для понимания: опция source_type has_one/has_many через Rails

В Rails 3.1 в документации указано

"4.2.2.13: source_type

Параметр: source_type указывает тип ассоциации источника для has_one: через ассоциацию, которая проходит через полиморфную ассоциацию. "

Я просто прочитал : источник объяснение, но не понял, для чего используется source_type?

4b9b3361

Ответ 1

:source_type имеет дело с ассоциациями, которые являются полиморфными. То есть, если у вас есть такие отношения:

class Tag < ActiveRecord::Base
  has_many :taggings, :dependent => :destroy
  has_many :books, :through => :taggings, :source => :taggable, :source_type => "Book"
  has_many :movies, :through => :taggings, :source => :taggable, :source_type => "Movie"
end

class Tagging < ActiveRecord::Base
  belongs_to :taggable, :polymorphic => true
  belongs_to :tag
end

class Book < ActiveRecord::Base
  has_many :taggings, :as => :taggable
  has_many :tags, :through => :taggings
end

class Movie < ActiveRecord::Base
  has_many :taggings, :as => :taggable
  has_many :tags, :through => :taggings
end

Затем тип источника позволяет делать такие запросы:

"Найдите все книги, которые были помечены тегом с именем" Fun ".

tag = tag.find_by_name('Fun')
tag.books

Без типа источника вы не сможете этого сделать, вы можете получить только коллекцию объектов, помеченных как "Fun". Если вы только специфицировали источник, он не знал бы, какой класс был для объектов, поэтому вы не знаете, какую таблицу в БД вытащить. source_type Сообщает об этом типе объекта, который вы пытаетесь выполнить.

Это взято из этого сообщения в блоге: http://www.brentmc79.com/posts/polymorphic-many-to-many-associations-in-rails

Надеюсь, что это поможет.

Ответ 2

☝🏼 это сообщение о посте выше (у меня пока недостаточно репутации, чтобы добавить это в качестве комментария...)

Спасибо @TheDelChop за этот простой и прекрасный вариант использования. Я просто предлагаю дополнить ваше идеальное объяснение этой простой схемой, описывающей вашу пользовательскую историю. На всякий случай. Спасибо ! enter image description here