2011-03-03 114 views
1

我有一個簡單的用戶:編輯**位爲清楚起見,和山姆的建議如何確保關聯的屬性對於驗證關聯是否正確?

class User < ActiveRecord::Base 
    # <snip other attribs> 
    has_many :handles 
    has_one :active_handle, :class_name => "Handle" 

    validates_each :active_handle, :allow_nil => true do |record, attr, value| 
    record.errors.add attr, "is not owned by the correct user" unless record.handles.include?(value) 
    end 
end 

和把手型號:

class Handle < ActiveRecord::Base 
    belongs_to :user 
    attr_accessible :user_id 
    validates :user_id, 
     :presence => true, 
     :numericality => true 

    attr_accessible :name 
    validates :name, 
     #etc... 
end 

現在,我想檢查,當設置User.active_handle關聯,該句柄由正確的Handle.user_id擁有。我試圖在自定義驗證中執行此操作,並且還在用戶模型的驗證方法中執行此操作。兩種方式,它都與我想要的完全相反,它將處理的user_id設置爲執行檢查的用戶。

我在我的繩索末端,顯然我不明白的東西,谷歌沒有讓我到任何地方,我還沒有。

ETA:我也試圖操縱與條件HAS_ONE協會,似乎辜負了......

has_one :active_handle, 
     :class_name => "Handle", 
     :conditions => ['user_id =?', '#{self.id}'] 
+0

因此,用戶可以有很多句柄,並且你想檢查用戶是否有句柄,因爲'active_handle'。那是對的嗎? – s84 2011-03-03 20:35:27

+0

另外,你怎麼更新'active_handle'?你是從用戶對象還是從句柄對象做到這一點。或者換句話說,你試圖更新'active_handle'的控制器是什麼? – s84 2011-03-03 20:36:14

+0

正確,目前我正在嘗試從用戶控制器執行此操作。 – thecatwasnot 2011-03-03 20:47:38

回答

0

我會採取不同的方法來解決這個問題;正如你發現的那樣,雙重環節很混亂,很難維持。相反,我會把積極的國旗在手柄模式,並下令對標誌:active_handle協會:

class User < ActiveRecord::Base 
    has_many :handles 
    has_one :active_handle, :class_name => 'Handle', :order => 'handles.active DESC' 
end 

現在只有一個鏈接,它是相同的鏈接,該鏈接已經到位,建立平原has_many :handles關聯(即Handle模型中的user_id屬性)。現在只需找到用戶的第一個Handle並設置了活動標誌即可查找活動句柄。我會使用:order而不是:conditions,因爲這會給你一個很好的回退:如果沒有該用戶的句柄設置了活動標誌,Rails將會選擇一個用作默認值。

,然後在你的手柄模型,你可以有一個相當簡單的激活功能:

class Handle < ActiveRecord::Base 
    # ...stuff... 

    def activate! 
     # Pseudocode - sorry! 
     sql('UPDATE handles SET active = 0 WHERE user_id = ?', self.user_id) 
     self.active = true 
     self.save! 
    end 
end 

或者,如果你想能夠調用類似user.handles.activate(hdl),你可以把類似的東西作爲一個協會延期。或者user.active_handle = hdl。或...

希望這有助於!

+0

太棒了,好的,那是我想的失蹤鑰匙,我不知道我可以使用那樣的命令。非常感謝! – thecatwasnot 2011-03-03 21:30:26

0

如果從用戶模型做的,那麼你需要驗證添加到用戶模型而不是手柄模型,因爲用戶正在得到更新。

這是我如何驗證用戶實際上屬於句柄,然後才能使其處於活動狀態。

class Handle < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :handles 
    validates :handle_can_be_active? 

    def handle_can_be_active? 
     if self.handles.include?(self.active_handle) 
      #no problem 
     else 
      errors.add_to_base('Must belong to the handle before it can be active!') 
     end 
    end 
end 
+0

我想我沒有說清楚驗證方法是在用戶模型中發生的,但我會試着去看看。 – thecatwasnot 2011-03-03 21:04:17