是否有更有说服力的方法来创建具有可变列数的表:Active Record& Rails 3?

时间:2010-10-24 13:42:18

标签: activerecord ruby-on-rails-3

目前我有一个Order类。每个订单有1到无限数量的项目。直到运行时才知道项目数。由于活动记录/轨道中没有字段类型的数组,如何创建可变数量的列?

我能想到的唯一方法是提前指定一堆票证栏;但是非常不灵活和低效:

class CreateOrders < ActiveRecord::Migration
  def self.up
    t.integer :ticket_id, :ticket_id, :ticket_id, :ticket_id, :ticket_id
    t.decimal :total
    t.timestamps
  end

  def self.down
    drop_table :orders
  end
end

3 个答案:

答案 0 :(得分:4)

通常,数据库表的第3范式不具有可变数量的列。

你拥有的可以是2个表,一个用于订单,它“有很多”行项,因此这个LineItem模型将有条目存储在line_items表中,每个记录都有product_id和quantity,每个LineItem“属于“一个命令。 (有一个order_id或line_item.order引用它所属的顺序)。

答案 1 :(得分:0)

您必须使用另一个名为items的表,该表将具有 order_id 列。因此,许多项可以与单个订单相关联。换句话说,订单可以有很多项目。

阅读此article解释包含许多发票的订单(在您的案例中)。

答案 2 :(得分:0)

如前所述,您希望将其建模为belongs_to / has_many关系。

class CreateOrders < ActiveRecord::Migration
  def self.up
    t.decimal :total
    t.timestamps
  end

  def self.down
    drop_table :orders
  end
end

class CreateItems < ActiveRecord::Migration
  def self.up
    t.integer :ticket_id
    t.integer :order_id
    t.timestamps
  end

  def self.down
    drop_table :items
  end
end

class Order < ActiveRecord::Base
  has_many :items, :dependent => "destroy"
end

class Item < ActiveRecord::Base
  belongs_to :order
end

Order.all.each do |order|
  puts "Order " + order + " has items :"
  order.items.each { |item| puts "  " + item }
end