質問: Ruby (および/または Rails) で 2 つのオブジェクトをマージする簡潔な方法はありますか?
具体的には、jQuery のメソッドに似たものを見つけようとしてい$.extend()
ますが、最初に渡すオブジェクトのプロパティは 2 番目のオブジェクトによってオーバーライドされます。
Rails 3.2+ でテーブルレス モデルを使用しています。フォーム送信が発生すると、送信からのパラメーターを使用してユーザー オブジェクトが動的に入力されます。そのユーザー オブジェクトは、Ruby の PStore クラスを使用してページ リクエスト間で保持され、オブジェクトをフラット ファイルにマーシャリングして、後で簡単に取得できるようにします。
関連コード:
module Itc
class User
include ActiveModel::Validations
include ActiveModel::Conversion
include ActionView::Helpers
extend ActiveModel::Naming
def set_properties( properties = {} )
properties.each { |k, v|
class_eval("attr_reader :#{k.to_sym}")
self.instance_variable_set("@#{k}", v)
} unless properties.nil?
end
end
end
ユーザー オブジェクトの作成は次のように行われます。
user = Itc.User.new( params[:user] )
user.save()
上記のsave()
メソッドは ActiveRecord の save メソッドではなく、PStore 経由で永続化するために私が書いたメソッドです。
ユーザー オブジェクトが読み込まれており、フォームが送信されている場合は、次のようにします。
merged = existingUserObject.merge(User.new(params[:user])
merged
フォームの送信で変更されたプロパティのみが更新されるユーザー オブジェクトになります。
一般的にこれを行うためのより良い方法について誰かがアイデアを持っているなら、私はすべて耳にします。