2013-01-03 69 views
1

我有代表的一些方法和屬性的不同模型的模型,假設Rails的委託的屬性沒有@屬性,read_attribute返回nil

class ModelOne < ActiveRecord::Base 
    # this model has some_property column in database 
end 

class ModelTwo < ActiveRecord::Base 
    belongs_to :model_one 

    delegate :some_property, :to => :model_one 
end 

的問題是,我可以通過調用方法訪問'some_property',但不能通過read_attribute訪問。

> obj1 = ModelTwo.last 
> obj1.some_property 
=> "some value" 
> obj1.read_attribute :some_property 
=> nil 
> obj1.inspect 
=> "#ModelTwo ... , ... , some_property: nil " 

它可以設置該屬性:

> obj1.some_property = "some value" 
> obj1.inspect 
=> "#ModelTwo ... , ... , some_property: "some value" " 

所以我可以通過調用來訪問它委託的屬性而不是由read_attribute或通過檢查。有沒有機會通過read_attribute獲取屬性值?

回答

0

也許你應該嘗試重寫read_attribute方法。我不使用read_attribute,但在類似的情況下,我不得不重寫哈希方法:

def [](key) 
    value = super 
    return value if value 
    if super(key+"_id") 
    begin 
     send(key) 
    rescue NoMethodError 
    end 
    end 
end 

它不漂亮,也有可能與調用發送(鍵)無驗證更準確的安全問題。

0

如果你看看read_attribute執行:

  # File activerecord/lib/active_record/attribute_methods/read.rb, line 128 
      def read_attribute(attr_name) 
      self.class.type_cast_attribute(attr_name, @attributes, @attributes_cache) 
      end 

不是基於屬性訪問器上(在你的情況some_property),但直接訪問@屬性實例變量,這是有道理的,因爲read_attribute是較低級別的API允許您繞過訪問者。因此,你不能做你想做的事。

這可能不是您正在尋找的答案,但是我會在您的設計中重新考慮的是爲什麼您需要通過read_attribute訪問您的屬性。如果您向我們展示了您在何處以及如何使用read_attribute,我很樂意爲您提供幫助。