Перегрузка назначения модели для создания связанных моделей - PullRequest
0 голосов
/ 13 декабря 2010

У меня есть модель для объекта списка воспроизведения, который имеет несколько дорожек. Это: has_many: through, с PlaylistItem в качестве таблицы соединения.

Когда модель будет создана, я хочу просто пройти через аккуратный массив track_ids, чтобы создать все связанные элементы PlaylistItems (все треки уже существуют). Я представляю это как API, так что я не могу действительно создавать красивые формы / контролировать ввод.

# in PlaylistsController
@playlist = Playlist.new :some_attr => "ABCDE", :playlist => ["123","22","11"]

То, что я пытаюсь сделать, - это создать собственный метод назначения, подобный этому:

class Playlist < ActiveRecord::Base
  ...
  def playlist=(track_array)
    track_array.each do |track_id|
      # check for valid track_id, add info to errors if something's wrong
      # for valid tracks, add it to playlist_items
      playlist_items.create(:track_id => track_id)
    end
  end

Так как здесь я использую create вместо new, это ошибка, потому что текущий создаваемый элемент списка воспроизведения еще не имеет идентификатора. Я собираюсь придерживаться удаления ключа и сейчас делать все это в контроллере, но я уверен, что должен быть какой-то способ добиться этого аккуратного трюка с заданиями. Есть мысли?

Обновление

Я только что нашел решение:

playlist_items << playlist_items.new(:track_id => track_id)

Кажется, работает. Надо было подумать о том, чтобы вернуть его обратно в свойства объекта Playlist и использовать новые ранее ...

1 Ответ

1 голос
/ 13 декабря 2010

Вы можете попробовать использовать встроенные назначения:

class Playlist < ActiveRecord::Base
  ...
  def playlist=(track_array)
    self.track_ids = track_array.select do |track_id|
      # check for valid track_id, add info to errors if something's wrong
      # for valid tracks, return true
    end
  end
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...