2013-08-05 5 views
0

Я новичок в rails, и я пытаюсь связать песню по умолчанию с темой. Проблема в том, что если я даю теме атрибут default_song_id, я могу получить доступ к песне напрямую с помощью вызова default_song, если я сделаю тему принадлежностью к песне.Есть ли другая ассоциация, которая ведет себя как own_to?

Моя проблема с этим - это просто название ассоциации. Тема, очевидно, не принадлежит песне в иерархии моих моделей, и у песен слишком много атрибутов. Не имеет смысла придавать песням атрибут theme_id, поскольку песни задействованы во множестве других отношений, и это действительно тема, которая касается конкретной песни, плюс одна песня может ссылаться на несколько тем.

У меня есть другие варианты?

ответ

1

Похоже, что ассоциация «has_many: through» может быть тем, что вы ищете. Здесь есть большой пробег: http://guides.rubyonrails.org/association_basics.html.

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

class Song < ActiveRecord::Base 
    has_many :assignments 
    has_many :themes, through: :assignments 
end 

class Theme < ActiveRecord::Base 
    has_many :assignments 
    has_many :songs, through: :assignments 
end 

class Assignment < ActiveRecord::Base 
    belongs_to :song 
    belongs_to :theme 
end 

Для каждой пары вы затем присвоение с theme_id и song_id, так что вы всегда можете запросить таблицу назначений, где theme_id/song_id = x для извлечения любой связанной записи. Надеюсь, этот подход достаточно гибкий, чтобы делать то, что вы пытаетесь сделать.

+0

Хотя мне нравится эта идея, и это то, что, возможно, упростило бы вещи, если бы я применил ее во всем приложении, я все равно хочу избежать посредника. Если никто не ответит другим ответом, который работает, я буду отмечать это как таковое. – DogNibbler

+0

Если вам нравятся аспекты «многие-ко-многим», но вы хотите избежать промежуточной модели, проверьте «has_and_belongs_to_many». http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many – MrTheWalrus

0

Что касается используя другое имя для определения ассоциации: Нет

Rails является упрямыми рамками, дизайна - convention over configuration. belongs_to - это ключевое слово, которое его дизайнеры выбрали для этой концепции в описаниях моделей/ассоциаций DSL, и вы должны попытаться привыкнуть к ее использованию. Постарайтесь иметь в виду, что то, что вы пишете, по-прежнему код; просто потому, что много Ruby/Rails читается как английский, это не значит, что - это Английский, и ключевые слова не всегда будут иметь то же значение, что и английские слова, которые они похожи.

Это theoretically possible для псевдонима belongs_to и других макросов ассоциации, но вы действительно не должны. Это повредит читабельности вашего кода, если кто-либо еще когда-нибудь захочет его использовать.

+0

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

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