我正在使用Ruby on Rails 4,我有这个用户模型:
require 'uuid'
UUID.state_file = false
UUID.generator.next_sequence
class User < ActiveRecord::Base
attr_accessor :email, :password
has_many :entries
after_initialize do |user|
user.entry_hash = UUID.new.generate
end
end
这基于以下数据库迁移:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string "email"
t.string "password"
t.string "entry_hash"
t.timestamps
end
end
end
我想自动生成一个uuid作为与该用户关联的哈希值。
使用rails控制台创建新用户,我执行以下操作:
1)我使用电子邮件和密码创建用户:
irb(main):001:0> u = User.create(:email=>'abc@gmail.com', :password=>'myPass')
(0.1ms) BEGIN
SQL (0.6ms) INSERT INTO `users` (`created_at`, `entry_hash`, `updated_at`) VALUES ('2013-12-07 22:32:28', '60744ec0-41bd-0131-fde8-3c07542e5dcb', '2013-12-07 22:32:28')
(3.7ms) COMMIT
=> #<User id: 2, email: nil, password: nil, entry_hash: "60744ec0-41bd-0131-fde8-3c07542e5dcb", created_at: "2013-12-07 22:32:28", updated_at: "2013-12-07 22:32:28">
2)但这很奇怪。如果您查看SQL,它不会插入除entry_hash之外的任何内容,输出对象将显示电子邮件和密码为nil。但是,当我尝试访问这些属性时,我会得到我放置的属性。
irb(main):002:0> u.email
=> "abc@gmail.com"
irb(main):003:0> u.id
=> 2
irb(main):004:0> u.password
=> "myPass"
irb(main):005:0> u.entry_hash
=> "60744ec0-41bd-0131-fde8-3c07542e5dcb"
我是Ruby on Rails的新手,我知道后台会有一些神奇的东西,但有人可以告诉我这里有什么吗?我只想创建一个带参数的对象。
干杯
更新 我通过删除attr_accessor行修复了我遇到的问题。任何人都知道为什么会让它发挥作用?
答案 0 :(得分:3)
attr_accessor
可用于您不希望直接存储在数据库中的值,并且仅在对象的生命周期内存在(例如密码)。
在数据库中没有列但仍希望在表单中显示字段时使用。该字段是Rails模型中的“虚拟属性”。
方法create
在数据库中创建行,并返回ruby对象。这就是为什么通过变量u
访问字段的工作原理,它在控制台打开时仍处于活动状态。但是,没有任何东西进入数据库。