Rails4.2:具有虚拟密码属性

时间:2016-08-21 22:14:49

标签: ruby-on-rails ruby-on-rails-4

我的目标是为包含passwordpassword_confirmation的虚拟属性的员工(思考用户)模型设定种子。我使用巫术(0.9.1)作为我的身份验证框架和种子库(0.4.0)来组织对象。

生成种子时我收到的错误是:ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column employees.password does not exist

以下是一些文件,用于说明我如何编写内容:

initial_model.rb

create_table :employees do |t|
    .
    .
    .
    t.string    :email
    t.string    :crypted_password,                default: nil
    t.string    :salt,                            default: nil
    t.string    :reset_password_token,            default: nil
    t.datetime  :reset_password_token_expires_at, default: nil
    t.datetime  :reset_password_email_sent_at,    default: nil
    t.datetime  :deleted_at
    t.timestamps                   null: false
end

模型/ employee.rb

class Employee < ActiveRecord::Base
  authenticates_with_sorcery!
  attr_accessor :password, :password_confirmation
  acts_as_tenant(:account)
  acts_as_paranoid
  .
  .
  .
  validates :password, length: { minimum: 6, allow_nil: true }, if: -> { new_record? || changes["password"] }
  validates :password_confirmation, presence: true, if: -> { new_record? || changes["password"] }
  .
  .
  .
end

employees.seeds.rb

after :accounts, :admins do
  accounts = Account.all
  accounts.each do |account|
    5.times do
      employee = account.employees.find_or_create_by!(
                                                        avatar: "#{FFaker::Avatar.image}",
                                                        avatar_id: "#{FFaker::IdentificationESCO.id}",
                                                        avatar_filename: "#{FFaker::CheesyLingo.word}_profile_image",
                                                        first_name: "#{FFaker::Name.first_name}",
                                                        last_name:  "#{FFaker::Name.last_name}",
                                                        arrival_date: "#{SeedHelpers.random_date_in_range(1979..2016)}",
                                                        dob: "#{SeedHelpers.random_date_in_range(1939..1998)}",
                                                        gender: "#{FFaker::Gender.sample}",
                                                        email: "#{FFaker::Name.name.tr(" ", "_").downcase}@example.com",
                                                        password: "tester",
                                                        password_confirmation: "tester",
                                                        is_admin: false
                                                      )
      puts "Employee number: #{employee.id} created for Account: #{account.facility_name}"
    end
  end
end

我能够为Employee生成种子的唯一方法是在查找/创建员工时从哈希中删除虚拟属性,并从模型中删除密码/ password_confirmation验证。

我很想知道我是否忽略了在种子中使用虚拟属性而不抛出PG错误的方法?

1 个答案:

答案 0 :(得分:0)

事实证明,使用#create代替#find_or_create_by!生成员工不会触发PG错误。

如果有人有更多经验丰富的光线,我会将问题保持开放一周左右。

我的两分钱是find_or_create_by!正在搜索与虚拟属性匹配的列。由于找不到我的模式中不存在的db列,因此在调用find_or_create_by!时由于<div class="flex-main-container"> <img src="http://www.modifiedstreetcars.com/sites/default/files/styles/carousel_circle/public/Nissan-GTR-White-Custom1.jpg?itok=RTxhTPOv" alt=""> <img src="http://www.buntycars.com/contents/member/buntycars/photos/Hot-Modified-Car-Wallpape-721c6.jpg" alt=""> <figure> <img src="http://modscar.net/wp-content/uploads/2016/04/30-MODIFIED-CARS-ARE-SHINING-AT-THE-ZOMBIE-APOCALYPSE.jpg" alt=""> <figcaption>explanatory caption</figcaption> </figure> <figure> <img src="http://modscar.net/wp-content/uploads/2016/04/30-MODIFIED-CARS-ARE-SHINING-AT-THE-ZOMBIE-APOCALYPSE.jpg" alt=""> <figcaption>explanatory caption</figcaption> </figure> </div> 的性能而在数据库级而不是应用程序级别引发错误。