2013-05-09 93 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