2012-10-10 44 views
0

我正在從電子表格文檔導入學生數據堆。每行學生數據將代表一個新用戶,但是,存在導入已存在的學生的可能性,我想繞過我的一些用戶驗證,例如用戶名唯一性,以便我可以爲新記錄和現有記錄構建關聯,但只有當他們被輸入到同一所學校時。Rails將參數傳遞給條件驗證

因此到目前爲止,我有以下驗證安裝在我的用戶模型:

user.rb

validates_uniqueness_of :username, :unless => :not_unique_to_school? 

def not_unique_to_school? 
    user = find_by_username(self.username) 
    user.present? && user.school_id == 6 
end 

現在我怎麼會去代替那個6的值我要在訪問控制器?教師將是那些處理導入的人,他們會將學生導入他們的學校,所以我通常會運行current_user.school_id來檢索我希望導入的學校ID,但我無法訪問current_user幫手在我的模型中。

我並不擔心重複的用戶名,因爲我將在不同的步驟處理這個問題,這只是初步驗證。


編輯

簡化學校&用戶模型:

user.rb

class User < ActiveRecord::Base  

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :username, 
        :first_name, :last_name, :school_id, :roles_mask 

    belongs_to :school 

    validates_presence_of :username, :on => :create, :message => "can't be blank" 
    validates_uniqueness_of :username, :unless => :unique_to_school? 

    def unique_to_school? 
    user = find_by_username(self.username) 
    user.present? && user.school_id == 6 
    end 

    def find_by_username(username) 
    User.where(:username => username).first 
    end  

end 

school.rb

class School < ActiveRecord::Base 
    attr_accessible :country_id, :name, :state_id 

    has_many :users  

end 
+0

你可以發佈你的整個用戶模型和學校模型嗎? –

+0

和你的控制器也可能有用。 –

+0

相信我你不希望我的整個用戶和學校模型,有很多不相關的複雜性在那裏。 – Noz

回答

1

這裏是最終爲我工作:

validate :user_cant_be_duplicate_in_other_schools 

def user_cant_be_duplicate_in_other_schools 
    errors.add(:username, :taken) if User.count(:conditions => ["school_id != ? AND username = ?", self.school_id, self.username]) > 0 
end 

與測試用戶是否屬於特定學校相反,我們正在測試是否缺乏歸屬感到一所特定的學校。我沒有拿出這個答案,另一個用戶發佈了這個答案,但不久之後又刪除了它,原因不明。

3

我的方法添加到您的辦學模式:

def student_named?(name) 
    self.users.where(:username => name).any? 
end 

然後在您的驗證:

def not_unique_to_school? 
    self.school.student_named?(self.username) 
end 
+0

這會在產生的重定向中爲我生成'Unknown key:username'。我無法確定它是來自學校模型還是用戶模型。 – Noz

+1

對不起,'.find'應該是'.where',請嘗試編輯後的代碼。 –

+1

現在很好用,感謝您的快速響應。我希望其他用戶沒有刪除他的答案,因爲這對我也有一些小的修改。 – Noz