【问题标题】:ActiveRecord AttributesActiveRecord 属性
【发布时间】:2009-12-24 15:51:04
【问题描述】:

我在 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 =&gt; "1234", :second =&gt; "9999"})。其次,当我尝试使用 getter 方法时,我得到了 nil,所以我添加了 getter 方法。为了分享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"

当我尝试通过p.postal_code 单独访问postal_code 属性时,该值存在。但是当我尝试显示p 时,postal_codenil。看起来后者用于save 操作。我无法用有意义的值保存邮政编码。

我对虚拟属性和属性覆盖的理解有问题。通过进一步的探索,我注意到哈希表示法和点表示法之间的区别。

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

我不知道为什么会这样。我希望能够save 填写postal_code

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    您想使用 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。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2010-09-27
      相关资源
      最近更新 更多