我想删除外键的_id
前缀?
新表。两个模型Order
和Product
class Order < ApplicationRecord
has_many :products
end
class Product < ApplicationRecord
belongs_to :delivery, :class_name => "Order"
end
点击products
表t.integer :delivery, index: true
错误:
ActiveRecord::AssociationTypeMismatch: Order(#85313090) expected, got 1 which is an instance of Fixnum(#73138750)
如何解决?
答案 0 :(得分:0)
为了尽量减少在做这样的事情时与铁杆战斗的可能性,我只是简单地覆盖delivery=(value)
方法。 e.g:
class Product < ApplicationRecord
belongs_to :delivery, :class_name => "Order"
def delivery=(id)
delivery_id = id
end
end
实际上,这会阻止将对象分配给关联。其他方法,例如, build_delivery
和delivery
仍然存在并且也可能被覆盖,但正如@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很棒的原因。
除非你有一个糟糕的遗留应用程序,否则没有充分的理由去除它。