Настройка ассоциации моделей в Rails - сохранение «со стороны внука» - PullRequest
1 голос
/ 29 июля 2011

Я новичок в Ruby, поэтому, пожалуйста, прости, если некоторые из них являются полным невежеством. Я хочу установить следующие ассоциации:

  • Транскрипция принадлежит Композиции
  • Композиция имеет много транскрипций, принадлежит Артисту
  • У художника много композиций (и транскрипций через композиции)

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

Как мне настроить модели? Должен ли я использовать некоторые виртуальные атрибуты в транскрипции?

# transcription.rb
def artist_name
  artist.name if self.artist
end

def artist_name=(name)
  self.artist = Artist.find_or_create_by_name(name) unless name.blank?
end 

и позже создайте Композицию с find_or_create_by_name, используя художника, которого я нашел или создал раньше?

Любая помощь приветствуется! Заранее спасибо

1 Ответ

1 голос
/ 29 июля 2011

Вы не можете установить исполнителя в транскрипции, потому что Artist имеет много Композиций, а не Транскрипций, вам нужно получить доступ к Artist через Композицию. Я надеюсь, что этот код объясняет это лучше.

Я устал и, возможно, что-то напутал, но мы идем (не проверено):

# transcription.rb

attr_writer :composition_name, :artist_name
before_save :set_artist_and_composition
validates_presence_of :artist_name, :composition_name

def composition_name
  composition.name
end

def artist_name
  composition.artist.name
end

def set_artist_and_composition
  artist = Artist.find_or_create_by_name(@artist_name)
  self.composition = Composition.find_or_create_by_name(@composition_name)
  self.composition.artist = artist
end
...