我有一个代表具有大量条目的定价表的模型,我想提供使用现有条目的值创建新定价的可能性。
有谁知道怎么做,然后续集正在使用?
我尝试过复制和克隆,但在这两种情况下,id仍然存在于现有模型中,因此将更新现有条目。
如果我尝试手动设置id,我会收到以下错误:
Sequel::InvalidValue: nil/NULL is not allowed for the id column
所以我需要找到一种创建模型的方法,该模型是新的但具有预填充值而无需手动设置代码。
有什么想法吗?
答案 0 :(得分:1)
new_pricing = Pricing.new(oldprice.attributes.tap{|attr| attr.delete("id")})
我从旧模型中获取属性作为哈希,然后删除id并通过传递除id之外的属性来创建新模型。
答案 1 :(得分:-1)
model.attributes
解决方案对我不起作用。续集模型的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