假设以下内容:
class Customer < ActiveRecord::Base
has_many :orders
end
class Order < ActiveRecord::Base
belongs_to :customer
end客户可以是red customers和/或blue customers,但他们绝不仅仅是客户。红色顾客自己养狗,蓝色顾客戴帽子(顾客必须戴帽子或养狗)。对于给定的顺序,red_customer永远不等于blue_customer。由于我从不使用customer_id,所以我希望从我的模式中删除它,并将其替换为red_customer_id和blue_customer_id。每个订单都有一个red_customer_id和blue_customer_id。
例子..。
模式(目前很难看)
create_table "orders"
t.string "name"
t.integer "user_id" # I want to get rid of this
t.integer "red_customer_id"
t.integer "blue_customer_id"
end但是如果我删除了user_id,那么我的关联就会中断。我怎么才能把这个清理干净?
发布于 2015-10-06 22:55:05
假设一个订单一次只能属于一个用户,我不建议您的表中有2个foreign_keys。您可以使用单表继承实现相同的结果:
class Customer < ActiveRecord::Base
has_many :orders
end
class RedCustomer < Customer
end
class BlueCustomer < Customer
end
class Order < ActiveRecord::Base
belongs_to :red_customer, foreign_key: 'customer_id'
belongs_to :blue_customer, foreign_key: 'customer_id'
end通过这种方式,您可以为客户保留一个表,并在订单上保留一个foreign_key。
为此,您需要在customer表中添加一个type字符串列,同时作为Order迁移,将polymorphic: true添加到customer foreign_key声明中,这样还将创建列customer_type。
class CreateCustomers < ActiveRecord::Migration
def change
create_table :customers do |t|
t.string :type
t.timestamps null: false
end
end
end
class CreateOrders < ActiveRecord::Migration
def change
create_table :orders do |t|
t.references :customer, polymorphic: true, index: true
t.timestamps null: false
end
end
end它如预期的那样运作:
order = Order.create
order.red_customer = BlueCustomer.create #=> raises <ActiveRecord::AssociationTypeMismatch>
order.red_customer = RedCustomer.create #=> Ok
order.blue_customer #=> nil
order.red_customer #=> #<RedCustomer id: ...>
order.blue_customer = BlueCustomer.create #=> Ok
order.red_customer #=> nil希望这能帮到你。
https://stackoverflow.com/questions/32974838
复制相似问题