ruby-on-rails - intermedia - relaciones en ruby on rails
Cómo insertar filas cuando se usa una relación de muchos a muchos (3)
Dado lo siguiente, ¿cómo podría insertar filas en mi db? (¿O qué debería corregir en mi esquema?)
Modelos:
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
Esquema:
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
Perdí unas horas tratando de insertar registros, usando la consola de rieles para probar cosas.
Si entendí correctamente
item = Item.new(:name => "item")
item.transactions.build(:name => "transaction")
item.save!
Este esquema debería darle los resultados que está buscando:
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
Aquí están los modelos:
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
Ahora usando la consola:
>> 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>
(Editar: el nombre del modelo "Transacción" puede causarle algunos problemas debido a ActiveRecord :: Transactions. Hay un ticket de faro ).
Su esquema no está configurado correctamente. "referencias" es un alias de "belongs_to". El artículo y la transacción no pertenecen a trans_items, cada uno tiene_many trans_items (de acuerdo con sus modelos)
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
(editar: make belongs_to singular)
¿Soltó el db y volvió a ejecutar las migraciones para construir el nuevo esquema?
rake db: drop && rake db: crea && rake db: migrate
Esto es lo que obtengo en la consola:
>> 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>