2017-10-04 5 views
1

_idの外部キーのプレフィックスを削除しますか?
新しいテーブル。二つのモデルOrderproductsテーブルでProduct外部キーの名前を変更する方法は?

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

メイクt.integer :delivery, index: true

エラー:

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

どのように修正するには?

+2

非標準の外部キー名を使用するのは良い考えのように思えますが、将来あなたを噛んでしまいます。 Rails Wayの使用を強く検討してください。 – moveson

答えて

0

このようなときにレールと戦う可能性を最小限に抑えるには、単にdelivery=(value)メソッドをオーバーライドします。例:

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

    def delivery=(id) 
    delivery_id = id 
    end 
end 

実際、これは関連付けにオブジェクトを割り当てることを妨げます。他の方法、例えば。 build_deliverydeliveryはまだ存在し、上書きすることもできますが、@movesonは既に指摘しているように、レールの方法から苦労すると、後で痛みが発生します。

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 
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を素晴らしいものにするものです。

恥ずかしいレガシーアプリケーションがない限り、それをスカートする良い理由はありません。

関連する問題