1

只需尝试弄清楚如何将属性从一个活动模型复制到另一个,而不必一一进行。

我有两个模型,一个是 RFM(ruby to 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 个,并且想知道是否有一种方法可以做到这一点而不必指定每个属性,例如,如果两个对象上的属性名称相同,则会自动复制它们。

4

1 回答 1

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
于 2013-11-15T07:08:04.167 回答