多対多リレーションを使用するときに行を挿入する方法
-
08-07-2019 - |
質問
次のことを考えると、データベースに行を挿入するにはどうすればよいですか? (または、スキーマで何を修正する必要がありますか?)
モデル:
class Item < ActiveRecord::Base
has_many :tran_items
has_many :transactions, :through => :tran_items
end
class TranItem < ActiveRecord::Base
belongs_to :item
belongs_to :transaction
end
class Transaction < ActiveRecord::Base #answer: rename Transaction
has_many :tran_items
has_many :items, :through => :tran_items
end
スキーマ:
create_table :items do |t|
t.references :tran_items #answer: remove this line
t.string :name
end
create_table :tran_items do |t|
t.belongs_to :items, :transactions, :null => false #answer: unpluralize
t.integer :quantity
end
create_table :transactions do |t|
t.references :tran_items #answer: remove this line
t.decimal :profit
end
Railsコンソールを使用してテストを行い、レコードを挿入しようとして数時間を失いました。
解決
(編集:モデル名&quot; Transaction&quot;は、ActiveRecord :: Transactionsによる問題を引き起こす可能性があります。灯台チケットがあります。
スキーマが正しく設定されていません。 &quot;参照&quot;は、「belongs_to」のエイリアスです。アイテムとトランザクションは belong_to trans_itemsではなく、それぞれ has_many trans_items(モデルに応じて)
create_table :items do |t|
t.string :name
end
create_table :tran_items do |t|
t.belongs_to :item, :transaction, :null => false
t.integer :quantity
end
create_table :transactions do |t|
t.decimal :profit, :default => 0
end
(編集:belongs_toをsingularにする)
データベースを削除し、移行を再実行して新しいスキーマを構築しましたか?
rake db:drop&amp;&amp; rake db:create&amp;&amp; rake db:migrate
コンソールに表示される内容は次のとおりです。
>> i = Item.create(:name => 'My Item')
=> #<Item id: 2, name: "My Item">
>> t = Transaction.create(:profit => 100)
=> #<Transaction id: 2, profit: #<BigDecimal:2411d2c,'0.1E3',4(8)>>
>> t.tran_items.create(:item => i)
=> #<TranItem id: nil, item_id: 2, transaction_id: 2, quantity: nil>
他のヒント
正しく理解できた場合。
item = Item.new(:name => "item")
item.transactions.build(:name => "transaction")
item.save!
このスキーマにより、探している結果が得られます。
create_table :items do |t|
t.string :name
end
create_table :purchase_items do |t|
t.belongs_to :item, :purchase, :null => false
t.integer :quantity
end
create_table :purchases do |t|
t.decimal :profit, :default => 0
end
モデルは次のとおりです。
class Purchase < ActiveRecord::Base
has_many :purchase_items
has_many :items, :through => :purchase_items
end
class Item < ActiveRecord::Base
has_many :purchase_items
has_many :purchases, :through => :purchase_items
end
class PurchaseItem < ActiveRecord::Base
belongs_to :item
belongs_to :purchase
end
コンソールを使用して:
>> i = Item.create(:name => 'Item One')
=> #<Item id: 1, name: "Item One">
>> p = Purchase.create(:profit => 100)
=> #<Purchase id: 1, profit: #<BigDecimal:2458cf4,'0.1E3',4(8)>>
>> p.purchase_items.create(:item => i)
=> #<PurchaseItem id: 1, item_id: 1, purchase_id: 1, quantity: nil>
所属していません StackOverflow