2016-10-03 85 views
0

我有一個表格,其中primary_address_iddelivery_address_id列引用包含街道地址的表中的行。我想創建模型ActiveRecord的,所以我可以寫ActiveRecord:如何引用同一類別的兩個FK

ci = Contact.create(full_name: 'Willy', company: 'Chocolate Factory') 
pa = ci.primary_address.create(street: 'Seestrasse', city: 'Kilchberg') 
da = ci.delivery_address.create(street: 'Flughafenstrasse', city: 'Zurich') 

(基本上,我想實現類似的功能an example on RoR guides

contact.rb:
class Contact < ActiveRecord::Base 
    belongs_to :primary_address, :class_name => 'Address' 
    belongs_to :delivery_address, :class_name => 'Address' 
end 
address.rb:
class Address < ActiveRecord::Base 
end 

當我嘗試從上面的示例運行ci.primary_address.create時,我得到:

...activemodel-5.0.0.1/lib/active_model/attribute_methods.rb:433:in `method_missing': undefined method `create' for #<Address:0x007f8ef9132128> (NoMethodError) 
    from /.../main.rb:16:in `<top (required)>' 
    from -e:1:in `load' 
    from -e:1:in `<main>' 

我想知道我的模型是否有意義,爲什麼create方法不可用?

我在Rails之外使用ActiveRecord。


CREATE TABLE contacts 
(
    id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    name VARCHAR(20), 
    company VARCHAR(20), 
    primary_address_id INT(11), 
    delivery_address_id INT(11), 
    CONSTRAINT primary_address_fk FOREIGN KEY (primary_address_id) REFERENCES addresses (id) ON DELETE SET NULL, 
    CONSTRAINT delivery_address_fk FOREIGN KEY (delivery_address_id) REFERENCES addresses (id) ON DELETE SET NULL 
); 
CREATE TABLE addresses 
(
    id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    street VARCHAR(40), 
    city VARCHAR(20), 
); 
+0

你確定這是你的代碼是什麼樣子becasue它實際上是調用'create_other'這是不是'Address'所以我假定缺少的東西在這裏的方法。 – engineersmnky

+0

@engineersmnky你是對的,我修飾了代碼併發布了另一條錯誤消息。我已糾正它。 –

回答

0

你會發現,在你提到的例子中,兩種模式之間的關係是周圍的其他方式。你的聯繫記錄屬於你的地址記錄,而在這個例子中,關係是has_many。

has_many(或其好友has_one)可能是一種更自然的表達關係的方式 - 除非您打算將一個地址記錄附加到多個聯繫人記錄中。

剛剛檢查了rails文檔 - has_many爲您提供了一個create()方法; belongs_to沒有。

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

+0

我已經使用belongs_to,因爲它將FK引用地址到'contacts'表中,這對我來說很自然。你將如何用has_many建模這個關係? –

+0

我不認爲我會使用has_many。表達它的自然方式似乎是'has_one primary_address'和'has_one delivery_address'。然後使用'Address.create()'並分配它們。 –

+0

所以你會把這些has_ones放在'Contact'類和外鍵到'addresses'表中? 感謝您提供'Address.create'提示。它似乎與我的原始模式和未修改的Contact類一起工作。 –

相關問題