重载模型分配以创建关联模型

时间:2010-12-13 08:15:26

标签: ruby-on-rails activerecord ruby-on-rails-3

我有一个具有多个曲目的播放列表对象的模型。它是a:has_many:through,PlaylistItem作为连接表。

当创建模型时,我想简单地通过一个整齐的track_id数组来创建所有相关的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,这是一个错误,因为正在创建的当前播放列表项目还没有ID。我将坚持删除密钥并暂时在控制器中执行所有操作,但我确信必须有一些方法来实现这个整洁的分配技巧。有什么想法吗?

更新

我刚刚找到了解决方案:

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

似乎有效。应该考虑将其分配回播放列表对象属性并使用新的早期...

1 个答案:

答案 0 :(得分:1)

您可以尝试使用内置作业:

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