gpt4 book ai didi

ruby-on-rails - 在 Ruby 中从一个对象映射到另一个对象

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:19 26 4
gpt4 key购买 nike

我有两个对象,一个UserData 对象和一个User 对象。目前它们看起来像这样:

user_data.rb

class UserData < ActiveRecord::Base
self.table = "users"
end

用户.rb

class User
attr_accessor :first_name, :last_name, :email, :password
end

我现在要做的是将 UserData 对象映射到 User 对象,反之亦然。对于第一种情况,我有以下代码:

module Mappers
module UserMapper
def map user
@user = UserData.new
@user.first_name = user.first_name
@user.last_name = user.last_name
@user.password = user.password
@user.email = user.email
end
end
end

但是,问题是每当我向用户表添加新列时,我也必须在映射器中添加代码。当我的代码中有大量需要映射的对象时,它会变得非常困惑。我的问题是:是否有更好的/动态的方式来执行此操作?理想的情况是我不必再接触 Mapper 代码。

最佳答案

您可以通过调用 attribute_names 类方法从 ActiveRecord 模型中获取属性名称列表。有了它,很容易迭代它们并依次获取和分配每个属性:

module UserMapper
def map(user)
@user = UserData.new do |user_data|
UserData.attribute_names.each do |attr_name|
next unless user.respond_to?(attr_name)
user_data[attr_name] = user.public_send(attr_name)
end
end
end
end

如果需要,您可以使用相同的方法在您的用户类中动态创建 attr_accessor:

class User
attr_accessor *UserData.attribute_names
end

关于ruby-on-rails - 在 Ruby 中从一个对象映射到另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35981596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com