1

我有这个模型

#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" 
4

4 回答 4

2

根据 Rails 指南:

每当实例化 Active Record 对象时,将调用 after_initialize 回调,直接使用 new 或从数据库加载记录时。

您可能应该找到另一种方法来初始化此“令牌”字段,否则每次从数据库重新加载记录时都会更改它。

于 2011-07-12T15:45:43.007 回答
1

嗯,要建立一个基于 的属性idid必须存在。最后,这样做:

after_create :create_token

def create_token
  self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
  self.save
end
于 2011-07-12T21:20:51.610 回答
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
于 2011-07-12T15:59:20.667 回答
0

我会用

before_create :create_token

所以它只在记录第一次插入数据库时​​生成。

于 2011-07-12T16:02:29.450 回答