Рельсы полиморфные с таблицей поиска - PullRequest
0 голосов
/ 08 февраля 2011

Какой лучший способ сделать это? Я хочу быть в состоянии дать жанрам групп и артистов через полиморфизм. Я могу сделать это с помощью habtm и has_many: through, но я пытаюсь выяснить, возможно ли это через полиморфизм.

GenreList - это таблица поиска со списком различных жанров (например, Punk, Pop, Metal). Я просмотрел скринкаст Райана Бэйта «Полиморфные ассоциации», но все еще застрял. В частности, я не уверен, как создать полиморфную таблицу Genre, которая будет подпитываться консервированными жанрами из модели GenreList (таблица поиска).

Правильно ли следующее?

rails generate model Genre genre_list_id:integer genreable_id:integer genreable_type:string

class Artist < ActiveRecord::Base
  has_many :genres, :as => :genreable
end

class Band < ActiveRecord::Base
  has_many :genres, :as => :genreable
end

class Genre < ActiveRecord::Base
  belongs_to :genreable, :polymorphic => true
end

class GenreList < ActiveRecord::Base
end

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

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

rails g model Genre genreable_id:integer genreable_type:string genre_name:string

class Artist < ActiveRecord::Base
   has_many :genres, :as => :genreable
end

class Band < ActiveRecord::Base
  has_many :genres, :as => :genreable
end

class Genre < ActiveRecord::Base
   belongs_to :genreable, :polymorphic => true
end

Затем я бы сделал несколько вложенных ресурсов в моих маршрутах:

resources :artists do
  resources :genres
end

resources :bands do
  resources :genres
end

изатем отредактируйте мой контроллер для обработки этого вложенного отношения.При таком подходе скажем, если я хочу увидеть все жанры первого исполнителя, которого я бы посетил:

/artists/1/genres

То же самое относится к группам.Я надеюсь, что я понял вашу проблему.Дайте мне знать, если я помог!

1 голос
/ 10 февраля 2011

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

# Generate some scaffolding
rails generate scaffold Artist name:string
rails generate scaffold Band name:string
rails generate scaffold Genre name:string
rails generate scaffold Genreing genre_id:integer genreable_id:integer genreable_type:string

# Models  
class Artist < ActiveRecord::Base
    has_many :genreings, :as => :genreable
    has_many :genres, :through => :genreings
end

class Band < ActiveRecord::Base
    has_many :genreings, :as => :genreable
    has_many :genres, :through => :genreings
end

class Genre < ActiveRecord::Base
    attr_accessible :name
    has_many :genreings
end

class Genreing < ActiveRecord::Base
    attr_accessible :genre, :genre_id, :genreable, :genreable_type, :genreable_id
    belongs_to :genre
    belongs_to :genreable, :polymorphic => true
end

# Controller
class GenreingsController < InheritedResources::Base
    belongs_to :genreable, :polymorphic => true
end

# Artist Form View
= simple_form_for(@artist) do |f|

  .inputs
    = f.input :name
    = f.association :genres, :as => :check_boxes

  .actions
    = f.button :submit

# Band Form View
... (Similar to Artist)
0 голосов
/ 08 февраля 2011

Это правильно. Одна вещь, которая, кажется, отсутствует, это отношение has_many от GenreList до Genre

class GenreList < ActiveRecord::Base
  has_many :genres
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...