如何复制不同类的对象?

时间:2013-07-07 20:37:05

标签: ruby-on-rails ruby activerecord

我有两种模式:

class Song < ActiveRecord::Base
  attr_accessible :title, :singer, :year, :production
end

class SongsCopy < ActiveRecord::Base
  attr_accessible :title, :singer, :year
end

在创建A(Song)时,将属性从B(SongsCopy)复制到B 的最简单方法是什么,记住SongsCopy没有属性{{ 1}}?

2 个答案:

答案 0 :(得分:3)

最佳方法是使用一些SQL在数据库中执行此操作:

insert into songs_copies (title, singer, year)
select title, singer, year
from songs
where ...

但是如果你有一堆回调并且你需要运行那么你可以做这样的事情:

song = some_song_that_you_already_have
copy = SongsCopy.create(song.attributes.except('id', 'production'))

或:

copy = SongsCopy.create(song.attributes.slice('title', 'singer', 'year'))

答案 1 :(得分:1)

这不是最漂亮的可能性(当然不是首选),但最简单的可能是:

class SongsCopy < ActiveRecord::Base
  def initialize(args = nil)
    if args.is_a? Song
      super
      self.title = song.title
      self.singer = song.singer
      self.year = song.year
    else
      super(args)
    end
  end
end

a = Song
b = SongsCopy.new(a)

我确信还有另一种方法可以做到这一点,但上述方法应该有效。