目前我有一个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
答案 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