我有这个模型
#post.rb
class Post < ActiveRecord::Base
belongs_to :user
after_initialize :create_token
attr_accessible :token
protected
def create_token
self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
end
end
rails c
中的
Post.find(:all,:conditions => { :user_id => 11})
=> [#<Post id: 26, content: "<p><strong>Yao Ming</strong> (<a shape=\"rect\" title...", user_id: 11, created_at: "2011-07-12 15:08:30", updated_at: "2011-07-12 15:08:30", title: "Yao Ming", guid: "0010f6c3-040b-4e13-aa38-3a002e6f2022", contentHash: "\xB9\\\xCBK\xB0A>4\xC4~\xFC\"\xEA7\xA6y", token: "4e73">]
当token: "4e73"
时,但是当我尝试
Post.find(:all,:conditions => { :user_id => 11, :token => "4e73"})
=> []
我得到[]
,为什么?
Post.find(:all,:conditions => { :user_id => 11}).first.token.class
=> String
Post.find(:all,:conditions => { :user_id => 11}).first.token
=> "3769"
答案 0 :(得分:2)
根据Rails指南:
只要有活动记录,就会调用after_initialize回调 对象通过直接使用new或记录来实例化 从数据库加载。
您可能应该找到另一种方法来初始化此“令牌”字段,否则每次从数据库重新加载记录时都会更改它。
答案 1 :(得分:1)
正如Eugen所说,这就是问题所在,在所有情况下,Rails没有本地方法可以做到这一点,所以你需要做的是:
class Post < ActiveRecord::Base
belongs_to :user
after_initialize :create_token
attr_accessible :token
protected
def create_token
if new?
self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
end
end
end
或只是
class Post < ActiveRecord::Base
belongs_to :user
attr_accessible :token
protected
def after_initialize
if new?
self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
end
end
end
答案 2 :(得分:1)
好吧,要根据id
构建属性,id
必须存在。最后,这样做:
after_create :create_token
def create_token
self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
self.save
end
答案 3 :(得分:0)
我会用
before_create :create_token
所以它只在记录首次插入数据库时生成。