5

次の場合、データベースに行を挿入するにはどうすればよいですか?(または、スキーマで何を修正する必要がありますか?)

モデル:

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コンソールを使用してテストし、レコードを挿入しようとして数時間を失いました。

4

3 に答える 3

6

(編集: モデル名 "Transaction" は、ActiveRecord::Transactions が原因で問題が発生する可能性があります。lighthouse ticket があります。)

スキーマが正しく設定されていません。「references」は「belongs_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 を単数形にする)

データベースを削除し、移行を再実行して新しいスキーマを構築しましたか?

rake db:drop && rake db:create && 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>
于 2008-11-13T00:03:47.047 に答える
2

このスキーマは、探している結果を提供するはずです。

   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>
于 2008-11-13T20:01:47.760 に答える
1

正しく理解できれば。

item = Item.new(:name => "item")
item.transactions.build(:name => "transaction")
item.save!
于 2008-11-12T21:38:20.630 に答える