Атрибуты ActiveRecord - PullRequest
       6

Атрибуты ActiveRecord

0 голосов
/ 24 декабря 2009

У меня есть следующий код в файле Active Record.

class Profile < ActiveRecord::Base
  attr_accessor :tmp_postal_code

  def postal_code=(postal_code)
    @temp_postal_code = postal_code[:first] + "-" + postal_code[:second]
  end

  def postal_code
    @temp_postal_code
  end
end

Я сначала переписал postal_code=(postal_code), потому что params в контроллере - это хеш, например, ({:first => "1234", :second => "9999"}) Во-вторых, когда я попытался использовать метод получения, я получил ноль, поэтому я добавил метод получения. Чтобы поделиться значением атрибута postal_code, я сделал @temp_postal_code.

Теперь все работает, кроме одного. Посмотрите на вывод консоли ниже.

>> p = Profile.new
  SQL (0.1ms)   SET NAMES 'utf8'
  SQL (0.1ms)   SET SQL_AUTO_IS_NULL=0
  Profile Columns (1.3ms)   SHOW FIELDS FROM `profiles`
=> #<Profile id: nil, name: nil, pr: "", age: nil, postal_code: nil>
>> p.postal_code = {:first => "123", :second => "9999"}
=> {:second=>"9999", :first=>"123"}
>> p.postal_code
=> "123-9999"
>> p.postal_code
=> "123-9999"
>> p.name = "TK"
=> "TK"
>> p.postal_code
=> "123-9999"
>> p.pr = "Hello"
=> "Hello"
>> p.age = 20
=> 20
>> p
=> #<Profile id: nil, name: "TK", pr: "Hello", age: 20, postal_code: nil> # WHY!!!
>> p.postal_code
=> "123-9999"

Когда я пытаюсь получить доступ к атрибуту postal_code по отдельности с помощью p.postal_code, значение существует. Но когда я пытаюсь показать p, postal_code равен nil. Похоже, что последний используется для операции save. Я не могу сохранить почтовый индекс со значимым значением.

Что-то не так с моим пониманием виртуальных атрибутов и перезаписи атрибутов. При дальнейшем исследовании я заметил разницу между хэш-нотацией и точечной нотацией.

  >> p[:postal_code]
  => nil
  >> p[:name]
  => "TK"
  >> p.postal_code
  => "123-9999"

Понятия не имею, почему это происходит. Я хочу быть в состоянии save с заполненным postal_code.

1 Ответ

0 голосов
/ 24 декабря 2009

Вы хотите использовать метод super, чтобы он фактически помещался в атрибуты AR.

  def postal_code=(postal_code)
    super(postal_code[:first] + "-" + postal_code[:second])
  end

  # you shouldn't even need this anymore
  def postal_code
    @temp_postal_code
  end

Вам также больше не понадобится attr_accessor. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...