2013-05-09 71 views
1

假設我有這樣的事情:如何使用Sequel保存新創建的關聯模型?

# Schema: 
DB.create_table :transactions do 
    primary_key :id 
    foreign_key :card_id, :cards 
    Integer  :amount 
end 
DB.create_table :cards do 
    primary_key :id 
    foreign_key :transaction_id, :transactions 
    Intger  :number 
end 

# Models: 
class Transaction < Sequel::Model 
    one_to_one :card 
end 
class Card < Sequel::Model 
    one_to_one :transaction 
end 

如何使這項工作,使得其既節省了transcard,及其各自的關聯?

trans = Transaction.new(:amount => 100) 
card = Card.new(:number => 4000500060007000) 
trans.card = card 
trans.save 

因爲它的立場,這不起作用,因爲card沒有首先保存,和Sequel拋出一個「無主鍵」的錯誤。如果我先保存card,它將不會得到transaction的ID。

基本上,我試圖避免這種情況:

# Save without associations first, but this will assign primary keys 
trans.save 
card.save 

# Now, manually create associations 
trans.card = card 
card.trans = trans 

# Re-save again, this time with associations 
trans.save 
card.save 

回答

3

你可能想嘗試改變關聯類型的東西更像:

# Schema: 
DB.create_table :transactions do 
    primary_key :id 
    Integer  :amount 
end 
DB.create_table :cards do 
    primary_key :id 
    foreign_key :transaction_id, :transactions 
    Integer  :number 
end 

# Models: 
class Transaction < Sequel::Model 
    one_to_many :card 
end 
class Card < Sequel::Model 
    one_to_one :transaction 
end 

現在你作爲創建:

trans = Transaction.new(:amount => 100) 
trans.save 
trans.add_card(:number => 4000500060007000) 

這將允許所有相同的選項,以及允許(但肯定不是要求)一個Transact離子被分成多張牌。

+0

謝謝,但我找不從'1改變對象關聯的解決方案:1''1:many'。 – 2013-07-05 18:48:17

+0

爲什麼不把表結合起來?如果關係是1:1和1:1,那麼沒有理由不創建具有兩組列的表 - 它將表示完全相同的數據。 – 2013-07-06 19:25:24

+0

這個例子很簡單,我用它來說明問題。實際的模型要複雜得多。 – 2013-07-06 23:31:47