tabla relaciones rails intermedia has_and_belongs_to_many ruby-on-rails model schema insert

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>