Ruby在活动模型对象之间复制

时间:2013-11-15 06:43:45

标签: ruby-on-rails

只需尝试找出如何将属性从一个活动模型复制到另一个活动模型而不必逐个复制。

我有两个模型,一个是RFM(ruby到filemaker),一个是mongoid都是mixin活动模型。

gem "ginjo-rfm"

模型

require 'rfm'

class StudentAdmin < Rfm::Base
  config :layout => 'STUDENT_ADMIN_LAYOUT'
  attr_accessor :name_first,:name_last
end

Mongoid模型

class Student
  include Mongoid::Document

  field :first_name, type: String
  field :last_name, type: String
end

我能做一个快速的副本吗?我在活动记录对象之间找到了一个样本,例如

 student_admin = ... #load StudentAdmin
 Student.new(student_admin.attributes.slice(Student.attribute_names))

但RFM不提供属性方法。

修改

对不起我想要实现的目标是比这更好的方式

student_admins = #get student admins from external service
students = []
student_admins.each() do |sa|
students.push(Student.create!(first_name: sa.name_first, last_name: sa.name_last)) 
end

这个例子只显示了2个属性,但实际上有超过50个,并且想知道是否有办法这样做而不必指定每个属性,例如如果两个对象上的属性名称相同,则自动复制它们。

1 个答案:

答案 0 :(得分:0)

试试这个:

students = student_admins.map do |sa|
  attrs = sa.methods.inject({}) do |hash, m|
    next unless Student.column_names.include? m.to_s
    hash[m] = sa.send m
  end
  Student.create(attrs)
end

Student必须是继承自ActiveRecord::Base

的类
class Student < ActiveRecord::Base
  ...
end