2017-10-04 106 views
1

我想刪除_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) 

如何解決?

+2

使用非標準的外鍵名稱似乎是個不錯的主意,但它會在將來咬你。強烈考慮使用Rails方式。 – 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真棒。

除非你有一個糟糕的遺留應用程序,否則沒有理由避開它。