如何重命名外键?

时间:2017-10-04 20:24:43

标签: ruby-on-rails ruby

我想删除外键的_id前缀?
新表。两个模型OrderProduct

class Order < ApplicationRecord
  has_many :products
end
class Product < ApplicationRecord
  belongs_to :delivery, :class_name => "Order"
end

点击productst.integer :delivery, index: true

错误:

ActiveRecord::AssociationTypeMismatch: Order(#85313090) expected, got 1 which is an instance of Fixnum(#73138750)

如何解决?

3 个答案:

答案 0 :(得分:0)

为了尽量减少在做这样的事情时与铁杆战斗的可能性,我只是简单地覆盖delivery=(value)方法。 e.g:

class Product < ApplicationRecord
  belongs_to :delivery, :class_name => "Order"

  def delivery=(id)
    delivery_id = id
  end
end

实际上,这会阻止将对象分配给关联。其他方法,例如, build_deliverydelivery仍然存在并且也可能被覆盖,但正如@moveson已经指出的那样,从轨道方式努力通常会在以后引起痛苦。

答案 1 :(得分:0)

您需要在模型中指定foreign_key名称:

class Order < ApplicationRecord
  has_many :products, foreign_key: "delivery"
end

class Product < ApplicationRecord
  belongs_to :delivery, :class_name => "Order", foreign_key: "delivery"
end

答案 2 :(得分:0)

好的答案是你没有。您可以使用外键和class_name选项对别名进行别名:

class Order < ApplicationRecord
  has_many :products, foreign_key: "delivery_id"
end

class Product < ApplicationRecord
  belongs_to :delivery, class_name: "Order"
end

但是_id后缀是一个非常好的约定,因为它很容易理解模式,因为它几乎过于明显哪些列是外键列。而惯例就是使Rails很棒的原因。

除非你有一个糟糕的遗留应用程序,否则没有充分的理由去除它。