Ассоциация HABTM Newbie Rails не работает - PullRequest
0 голосов
/ 16 июля 2010

Я новичок в Rails и пытаюсь создать отношение has_and_belongs_to_many между orders и items .

class Order < ActiveRecord::Base
  has_and_belongs_to_many :items
end

class Item < ActiveRecord::Base
  has_and_belongs_to_many :orders
end

Миграция для заказов (не показана. Очень базовая)

Миграция для OrderItems:

class CreateItems < ActiveRecord::Migration
  def self.up
    create_table :items do |t|
      t.string :name
      t.decimal :price

      t.timestamps
    end

    create_table :items_orders, :id => false do |t|
      t.references :item, :order
    end
  end

  def self.down
    drop_table :items
    drop_table :items_orders
  end
end

В скрипте / консоли я пытаюсь «доказать», что отношения работают, но либо мое понимание Ruby плохое (вероятно), либо моя модель.

$ script/console
Loading development environment (Rails 2.3.5)
>> o = Order.new
=> #<Order id: nil, name: nil, created_at: nil, updated_at: nil>
>> o.name = 'first order'
=> "first order"
>> o.save
=> true
>> o.items
=> []
>> i1 = o.items.new
=> #<Item id: nil, name: nil, price: nil, created_at: nil, updated_at: nil>
>> i1.name = 'some widget'
=> "some widget"
>> i1.price = 12.50
=> 12.5
>> i1.save
=> true
>> o.items
=> []
>> o.items.first
=> nil

ищет в базе данных development.sqlite3:

$ sqlite3 development.sqlite3 
SQLite version 3.6.12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
items              items_orders       orders             schema_migrations
sqlite> select * from items_orders;
sqlite> .schema items_orders
CREATE TABLE "items_orders" ("item_id" integer, "order_id" integer);
sqlite>

Ничего!

Я знаю, что это очевидно ... но не для меня ... на данном этапе в любом случае ...

что я пропустил / облажался?

1 Ответ

2 голосов
/ 16 июля 2010

Прежде всего, почему бы вам просто не использовать принадлежащие вам и has_many? Например:

class Order < ActiveRecord::Base
  has_many :items
end

class Item < ActiveRecord::Base
  belongs_to :order
end

Что касается того, почему вы не получаете ожидаемых результатов, вы можете попробовать:

order = Order.new
order.save
item = Item.new
item.order = order
item.save

или лучше

order = Order.create(myordercolumn => "whatever")
order.items.create(:name => "some widget")
...