2014-09-24 42 views
3

我希望我的用戶對象能夠與許多地址關聯,並且這些地址之一是主地址。使用a有很多,並且在同一模型上有一個關聯

我試圖做到這一點,而不使用布爾值來表示主地址,而是同時使用has-many和has-one關聯 - 按照PinnyM在以下SO中的第一種方法:Rails model that has both 'has_one' and 'has_many' but with some contraints

但我似乎無法得到它的工作。

我的遷移:

class User < ActiveRecord::Migration 
    def change 
     create_table(:users) do |t| 
      t.integer :primary_address_id 
      t.string :name 
     end 
    end 
end 

class Address < ActiveRecord::Migration 
    def change 
     create_table(:addresses) do |t| 
      t.integer :user_id 
      t.string :address 
     end 
    end 
end 

我的模型:

class User 
    has_many :addresses 
    has_one :primary_address, :class_name => "Address" 
end 

class Address 
    belongs_to :user 
    has_one :user 
end 

這讓我做user.addresses使用的has_many關聯,但我似乎無法訪問到了一個協會。我試過了:

user.primary_address 
user.addresses.primary_address 
user.addresses.primary_address.first 

我真的不明白如何正確設置這些關聯或如何訪問它們。將不勝感激您的幫助!

回答

2

剛創建的模型和您正在使用的關聯。我不明白爲什麼它不起作用,因爲我可以訪問primary_address。這是我用來使用rails控制檯訪問它的代碼。注意:我已經提前創建了一個用戶和兩個地址。

# in case if you have user with id = 1  
User.find(1).primary_address 
# or another example 
User.first.primary_address 

我不認爲你的協會將允許這個要求雖然:

user.addresses.primary_address 
user.addresses.primary_address.first 
+0

啊是有道理的。我只是錯誤地訪問它們。我不太瞭解設置主地址的has_one關聯。爲什麼用戶和地址模型中都有一個has_one?地址上的has_one和用戶上的belongs_to對我來說會更有意義。任何想法爲什麼這樣設置? – user3711600 2014-09-25 03:41:04

+0

實際上,在這種特殊情況下,你並不需要在Address模型中使用has_one。您需要belongs_to才能執行類似Address.first.user(訪問該用戶的地址所屬的用戶),但has_one不是必需的。測試時我沒有使用它。這也是因爲並非每個地址都將成爲主要地址。 – sapojnik 2014-09-25 04:09:13

相關問題