рельсы не находят атрибут - PullRequest
1 голос
/ 12 июля 2011

У меня есть эта модель

#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 ]

2 голосов
/ 12 июля 2011

Согласно Rails Guides:

Обратный вызов after_initialize будет вызываться всякий раз, когда создается экземпляр объекта Active Record, либо путем непосредственного использования new, либо когда запись загружается из базы данных.

Вероятно, вам следует найти другой способ инициализации этого поля 'токена', иначе оно будет изменяться при каждой перезагрузке записи из базы данных.

1 голос
/ 13 июля 2011

Ну, для построения атрибута на основе id, id должен существовать. Наконец, сделайте это:

after_create :create_token

def create_token
  self.token = "#{Digest::MD5.hexdigest("#{self.id}")[0,4]}"
  self.save
end
1 голос
/ 12 июля 2011

Как говорит Евгений, в этом-то и проблема, во всех случаях у 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
0 голосов
/ 12 июля 2011

Я бы использовал

before_create :create_token

, поэтому он генерируется только при первой вставке записи в базу данных.

...