См. предложенную функцию - хотя никто еще не работал над ней.
(редактирование: имя модели "Транзакция" может вызвать Вас некоторые проблемы из-за ActiveRecord:: Транзакции. Существует билет маяка.)
Ваша схема не настраивается правильно. "ссылки" являются псевдонимом к "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 исключительный),
Вы отбрасывали дб и повторно выполняли миграции для создания новой схемы?
обстреляйте db:drop &&, обстреливают db:create &&, обстреливают 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>