Полиморфные многие ко многим - PullRequest
1 голос
/ 08 января 2012

Следующие примеры отличаются только для моделей Книга и Фильм .

Пример 1: Book has_many :taggings, :as => :taggable

Пример 2: Book has_many :taggings, :through => :taggable

Что означает эта разница?


Пример 1 :

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

class Tag < ActiveRecord::Base
  has_many :taggings
  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

Пример 2:

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

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

class Tag < ActiveRecord::Base
  has_many :taggings
  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

Ответы [ 2 ]

1 голос
/ 09 января 2012

Если предположить, что примеры сработали ... и taggable была реальной моделью ... которая, как предполагает Сивей, вероятно, на самом деле не работает ...

:as defines a polymorphic association

и

:through says that
   if A has many B's
   and B has many C's
   then A has many C's through B
1 голос
/ 09 января 2012

Вы уверены, что второй пример работает?У меня нет рельсовой среды в окнах.Для моего понимания вашего вопроса,

case1.

has_many :taggings, :as => :taggable

здесь «taggable» не является точным названием модели, это просто псевдоним.(нет класса Taggable)

case2.

has_many :taggings, :through => :taggable

здесь «taggable» должна быть реальной (существующей) моделью, я имею в виду, что где-то должен быть класс Taggable.

см .: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

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