2011-02-07 7 views
0

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

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 

ответ

1

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

# 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

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

class GenreList < ActiveRecord::Base 
    has_many :genres 
end 
+0

Стефан, спасибо за это. Теперь я пытаюсь сортировать представления и контроллеры, чтобы они действительно работали. – face7hill

1

Я думаю, что ваша реализация немного странно. То, как я это сделаю, - создать модель Genre (в которой будут храниться все доступные жанры Punk, Rock, Metal и т. Д.). Тогда я бы сделал все это, что вы уже сделали, но без модели 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 

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

+0

xlubyonrails, извините за мой поздний ответ. Я все еще пробовал это. Ваш ответ полезен, но я действительно пытаюсь сохранить список жанров в его собственной таблице для ссылочной целостности. Я хочу хранить genre_list_ids в полиморфной таблице. Это начинает быть сложнее, чем я ожидал. В принципе, когда я добавляю/редактирую исполнителя или группу, я хочу, чтобы вы могли сразу же отменить жанры и сохранить жанры в жанровой полиморфной таблице. Я смотрю на inherited_resources, чтобы убедиться, что это упростит. Я опубликую свои результаты, если успею. Благодаря! – face7hill

Смежные вопросы