【问题标题】:Newbie Rails HABTM association not working新手 Rails HABTM 协会不起作用
【发布时间】:2010-07-16 11:08:17
【问题描述】:

我是 Rails 新手,正在尝试在 ordersitems 之间创建 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 =&gt; 'Pizza', :price =&gt; 12.75) 然后o.save 然后它会正确保存关系。想知道是否有另一种(阅读:更简单)的方式来思考这些关系?因为我的大脑认为如果我创建一个与订单相关的新“项目”,那么我应该能够保存“项目”并创建关系。但是 Rails 希望我保存 order 以创建与项目的关系。保存 item 什么都不做。

标签: ruby-on-rails has-and-belongs-to-many


【解决方案1】:

首先,为什么不直接使用belongs_to 和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")

【讨论】:

  • 我同意 Petros(如果我正确理解您的系统)。此外,如果您的模型名称与您的表名称匹配,您的生活会更轻松——因此将您的模型重命名为 ItemOrder。
  • 为什么我不使用 belongs_tohas_many?我可能会更清楚,但我没有使用它们,因为我试图弄清楚如何使用 has_and_belongs_to_many。 “订单”和“项目”可能具有误导性。不过,感谢您其余的回答。这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多