4

多くのエントリを持つ価格表を表すモデルがあり、既存のエントリの値を使用して新しい価格表を作成する可能性を提供したいと考えています。

誰かがこれを行う方法を知っていますか? Sequel が使用されていますか?

dup と clone を試しましたが、どちらの場合も ID は既存のモデルからまだ存在しているため、既存のエントリが更新されます。

ID を手動で設定しようとすると、次のエラーが発生します。

Sequel::InvalidValue: nil/NULL is not allowed for the id column

そのため、新しいモデルを作成する方法を見つける必要がありますが、手動でコードに設定することなく値が事前に入力されています。

何か案は?

4

2 に答える 2

4

それを見つけた:

new_pricing = Pricing.new(oldprice.attributes.tap{|attr| attr.delete("id")})

古いモデルから属性をハッシュとして取得し、id を削除して、id 以外の属性を渡して新しいモデルを作成します。

于 2012-10-29T21:29:50.413 に答える
-1

model.attributes解決策は私にはうまくいきませんでした。Sequel モデルto_hashには、ほぼ同等のものがありますが、to_hash逆シリアル化された値は返されません。シリアライザー (jsonbフィールドなど)を使用している場合、値がまだデシリアライズされていないため、単純に を渡すだけto_hashでは失敗します。new

これが私のために働く解決策です:

user = User.find(id: 123)

# freeze to avoid accidentally modifying the original user
user.freeze

# duplicate the record, deserialize values, and delete the primary key
# deserialization is useful if your model is using jsonb fields
record_copy = user.to_hash.merge(user.deserialized_values)
record_copy.delete(:id)

duplicate_user = User.new

# pass the has via `set_all` to avoid initialization callbacks
duplicate_user.set_all(record_copy)

# ... other important callbacks

duplicate_user.save
于 2016-02-16T15:50:55.660 に答える