2012-10-29 100 views
2

我有一個模型來表示包含大量條目的定價表,我想提供使用現有條目中的值創建新定價的可能性。克隆續集模型

有誰知道如何做到這一點,那麼續集是在使用?

我嘗試了dup和克隆,但在兩種情況下,id仍然存在於現有模型中,因此會更新現有條目。

如果我嘗試設置手工ID我得到以下錯誤:

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

所以我需要找到一種方法來創建一個模型,它是新的,但已經預填充值,而不需要設置在手工編碼。

任何想法?

回答

0

發現:

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

我從老款車型的屬性是哈希,然後取出ID,並通過將屬性除ID創建一個新的模型。

+0

你是怎麼得到的屬性? Sequel :: Model對象中沒有這樣的方法 –

+0

啊對不起,我們有一些實現方法AR的方法,但在Sequel中缺少方法,請嘗試:values.with_indifferent_access – jethroo

-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