【问题标题】:How to save newly-created associated models using Sequel?如何使用 Sequel 保存新创建的关联模型?
【发布时间】:2013-05-09 07:52:09
【问题描述】:

假设我有这样的事情:

# 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

【问题讨论】:

    标签: ruby sequel


    【解决方案1】:

    您可能想尝试将关联类型更改为类似于:

    # 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)
    

    这将允许所有相同的选项以及允许(但肯定不要求)将交易拆分到多张卡上。

    【讨论】:

    • 谢谢,但我正在寻找一种不会将对象关联从 1:1 更改为 1:many 的解决方案。
    • 为什么不直接合并表格呢?如果关系是 1:1 和 1:1,那么没有理由不创建包含两组列的表——它将表示完全相同的数据。
    • 这个例子很简单,我用它来说明问题。实际模型要复杂得多。
    • 我假设是这样,但在每种情况下,完全自反的 1:1 关系都与使用单个表相同。
    • sequel.rubyforge.org/rdoc/files/doc/… 的 Sequel 文档自己说“如果你想在两个模型之间建立 1-1 关系,你必须在一个模型中使用 many_to_one,在另一个模型中使用 one_to_one”和还有“one_to_one 关联可以被认为是 one_to_many 关联的子集,但关联表中只能有 0 或 1 条记录。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多