Rails将参数传递给条件验证

时间:2012-10-10 17:31:53

标签: ruby-on-rails-3 validation activerecord

我正在从电子表格文档中导入大量学生数据。每行学生数据都代表一个新用户,但是,存在导入现有学生的可能性,我想绕过我的一些用户验证,例如用户名唯一性,以便我可以为新记录和现有记录建立关联,但只有当他们被输入同一所学校时。

到目前为止,我的用户模型中有以下验证设置:

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

2 个答案:

答案 0 :(得分:3)

我会为你的学校模型添加一个方法:

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

然后在你的验证中:

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

答案 1 :(得分: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  

与测试用户是否属于特定学校相反,我们正在测试是否缺乏对特定学校的归属感。我没有拿出这个答案,另一个用户将此作为答案发布,但由于原因未知,不久后将其删除。