Сочетание полиморфной ассоциации с ассоциацией «многие ко многим» ... верно ли это? - PullRequest
2 голосов
/ 29 марта 2011

У меня есть модель жанра, и я хочу, чтобы оба видео имели много жанров, а профили имели много жанров.Я также хочу, чтобы в жанрах было много видео, а в жанрах - много профилей.Я разбираюсь в полиморфности и соединяемости таблиц, поэтому мне интересно, будет ли мой код ниже работать так, как я намереваюсь.Кроме того, я был бы признателен за любые советы о том, как получить доступ к вещам в моем контроллере и представлениях.

Это то, что я предполагаю, что таблица соединения должна выглядеть (я не думаю, что мне нужна сложная :has :throughассоциация, потому что все, что мне нужно в таблице соединений, это ассоциации и ничего больше, поэтому у таблицы не будет модели):

genres_videos_profiles:
-----------------------------------------------------
id | genre_id | genre_element_id | genre_element_type

Вот мой жанр.rb:

has_and_belongs_to_many :genre_element, :polymorphic => true

Вот видео.rb:

has_and_belongs_to_many :genres, :as => :genre_element

Вот профиль.rb:

has_and_belongs_to_many :genres, :as => :genre_element

Будет ли это работать так, как я намереваюсь?Я хотел бы получить отзыв.

Ответы [ 3 ]

1 голос
/ 29 марта 2011

Насколько я знаю, ассоциации HABTM не могут быть полиморфными, я не смог найти пример, подобный вашему, в документации API. Если вы хотите только соединять таблицы, ваш код может выглядеть так:

class Genre
  has_and_belongs_to_many :videos
  has_and_belongs_to_many :profiles
end

class Video
  has_and_belongs_to_many :genres
end

class Profile
  has_and_belongs_to_many :genres
end

И получить доступ к нему, как Майк уже писал:

@genre.profiles
@profile.genres
@genre.videos
@video.genres

Миграции (только для таблиц объединения):

class CreateGenresVideosJoinTable < ActiveRecord::Migration
  def self.up
    create_table :genres_videos, {:id => false, :force => true} do |t|
      t.integer :genre_id
      t.integer :video_id
      t.timestamps
    end
  end

  def self.down
    drop_table :genres_videos
  end
end

class CreateGenresProfilesJoinTable < ActiveRecord::Migration
  def self.up
    create_table :genres_profiles, {:id => false, :force => true} do |t|
      t.integer :genre_id
      t.integer :profile_id
      t.timestamps
    end
  end

  def self.down
    drop_table :genres_profiles
  end
end
1 голос
/ 21 июля 2011

Проверьте, что: http://blog.hasmanythrough.com/2006/4/3/polymorphic-through

Для меня это было идеально и чисто!

1 голос
/ 29 марта 2011

Я думаю, что has_and_belongs_to_many может быть немного сложным для понимания, когда дело доходит до полиморфизма (если он вообще работает). Так что если вы хотите сделать полиморфную вещь, то вы не можете использовать любой сквозной синтаксис:

class Genre < ActiveRecord::Base
  has_many :genres_videos_profiles
end

class GenresVideosProfile
  belongs_to :genre
  belongs_to :genre_element, :polymorphic => true

  scope :videos, where(:genre_element_type => "Video")
  scope :profiles, where(:genre_element_type => "Profile")
end

А потом вы используете это как:

# All genre elements
@genre.genres_videos_profiles.each do |gvp|
  puts gvp.genre_element.inspect
end

# Only video genre elements
@genre.genres_videos_profiles.videos.each do |gvp|
  puts gvp.genre_element.inspect
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...