2009-12-24 68 views
0

我在活动记录文件中有以下代码。ActiveRecord属性

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"})。其次,当我尝试使用getter方法时,我得到了零,所以我添加了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" 

我不知道为什么会出现这种情况。我希望能够savepostal_code填写。

回答

0

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

+0

非常感谢。现在一切工作文件。 – 2009-12-24 16:12:48