1

スプレッドシート ドキュメントから大量の学生データをインポートしています。学生データの各行は新しいユーザーを表しますが、既存の学生をインポートする可能性があり、それに応じてユーザー名の一意性などのユーザー検証の一部をバイパスして、新しいレコードと既存のレコードの両方の関連付けを構築できるようにしたいと考えています。ただし、同じ学校に輸入されている場合に限ります。

これまでのところ、 User モデルには次の検証設定があります。

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

学校.rb

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

  has_many :users    

end
4

2 に答える 2

4

School モデルにメソッドを追加します。

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

次に、検証で:

def not_unique_to_school?
  self.school.student_named?(self.username)
end
于 2012-10-10T17:50:07.147 に答える
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  

ユーザーが特定の学校に所属しているかどうかをテストするのではなく、特定の学校に所属していないかどうかをテストしています。私はこの答えを思いつきませんでした。別のユーザーがこれを答えとして投稿しましたが、不明な理由ですぐに削除しました。

于 2012-10-11T20:46:50.657 に答える