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

Как сделать эту работу таким образом, что она экономит trans, card и их соответствующие ассоциации?

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

Как можно заметить, это не работает, потому что card не сохраняется первым, и Sequel бросает ошибку «первичный ключ». Если я сначала сохраню card, он не получит идентификатор transaction.

В принципе, я пытаюсь избежать этого:

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

Это позволит использовать все те же параметры, что и разрешение (но, конечно, не требуется) транзакции иона, который должен быть разделен на несколько карт.

+0

Спасибо, но я ищу решение, которое не меняет ассоциации объектов с '1: 1' на' 1: many'. –

+0

Почему бы просто не объединить таблицу? Если отношение равно 1: 1 и 1: 1, то нет причин не создавать таблицу с обоими наборами столбцов - она ​​будет представлять одни и те же данные. –

+0

Этот пример тривиален, и я использовал его для иллюстрации проблемы. Фактические модели намного сложнее. –

Смежные вопросы