2014-05-25 80 views
1

很長時間的SO閱讀器,第一次海報。我有一個項目,有一個模型has_one字段和has_many相同的字段模型。我只是希望能夠使他們分開區分。這是我提出的最優雅的方式。這在技術上叫什麼?

我想知道我應該如何口頭提及當前使用的方法,如果有更好的方法可以做到這一點,那就是Rails 4+。

這裏是我使用的代碼:

# field.rb 
    class Field < ActiveRecord::Base 
     belongs_to :user 
    end 

    # user.rb 
    class User < ActiveRecord::Base 
     has_one :primary_field, class_name: 'Field' 
     has_many :secondary_fields, class_name: 'Field' 
    end 

u = User.create(name:"foo") 
u.primary_field = Field.create(name:"ruby on rails") 
u.secondary_fields << Field.create(name:"html/css") 
u.secondary_fields << Field.create(name:"javascript") 

編輯:有在我的方法錯誤,這不是技術上其中secondary_fields不正確作用域。我批准的答案解決了這個問題。

我仍然想知道這是否被稱爲特定的東西,因爲它確實看起來像這是相對經常使用。

回答

1

您需要一種方法來區分哪個字段是主字段。你現在所擁有的所有字段都是相同的,所以你將從secondary_fields關聯中獲得全部三個,並且primary_field實際上是隨機的(取決於你使用的數據庫)。

如果添加一個「主」列字段,你可以使用這樣的事情:

# field.rb 
class Field < ActiveRecord::Base 
    belongs_to :user 
    validates :primary, uniqueness: {scope: user, if: :primary} 
end 

# user.rb 
class User < ActiveRecord::Base 
    has_one :primary_field, -> {where(primary: true), class_name: 'Field' 
    has_many :secondary_fields, -> {where(primary: false)}, class_name: 'Field' 
end 

u = User.create(name:"foo") 
u.primary_field = Field.create(name:"ruby on rails", primary: true) 
u.secondary_fields << Field.create(name:"html/css") 
u.secondary_fields << Field.create(name:"javascript") 
+0

謝謝,我沒有意識到這一點。我也想知道如果用一個class_name以多種方式調用關聯模型被稱爲特定的東西? –

+0

不是我所知道的。我最終需要這樣的定期,我從來沒有遇到過一個特殊的術語。不過,其他人可能有一個。我幾乎不是權威來源:)。我想你可以稱之爲「過濾式關聯」,但我只是把它做了。 –

+0

我認爲你的答案已足夠。我會接受它並編輯我的問題,看看是否有人擁有它的名字。謝謝 –