【发布时间】:2010-07-16 11:08:17
【问题描述】:
我是 Rails 新手,正在尝试在 orders 和 items 之间创建 has_and_belongs_to_many 关系。
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>
没什么!
我知道这很明显……但对我来说不是……反正在这个阶段……
我错过了什么/搞砸了什么?
【问题讨论】:
-
好的,有点搞定了。似乎我的分配逻辑不适用于“Ruby”方式。如果我先做
item = o.items.build(:name => 'Pizza', :price => 12.75)然后o.save然后它会正确保存关系。想知道是否有另一种(阅读:更简单)的方式来思考这些关系?因为我的大脑认为如果我创建一个与订单相关的新“项目”,那么我应该能够保存“项目”并创建关系。但是 Rails 希望我保存 order 以创建与项目的关系。保存 item 什么都不做。
标签: ruby-on-rails has-and-belongs-to-many