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ガイドによると:

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 に答える