首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4:多态,单表继承,范围界定.?

Rails 4:多态,单表继承,范围界定.?
EN

Stack Overflow用户
提问于 2015-10-06 16:19:28
回答 1查看 41关注 0票数 0

假设以下内容:

代码语言:javascript
复制
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。

例子..。

  • @some_order.customer #不,坏,不想
  • @some_order.red_customer #返回一个用户对象
  • @some_order.blue_customer #返回一个用户对象

模式(目前很难看)

代码语言:javascript
复制
  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,那么我的关联就会中断。我怎么才能把这个清理干净?

EN

回答 1

Stack Overflow用户

发布于 2015-10-06 22:55:05

假设一个订单一次只能属于一个用户,我不建议您的表中有2个foreign_keys。您可以使用单表继承实现相同的结果:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

它如预期的那样运作:

代码语言:javascript
复制
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

希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32974838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档