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