0

我想创建一个虚拟属性,当您执行 model_instance.inspect 时将始终包含该属性。我知道 attr_reader 会给我与定义实例方法相同的东西,但我希望这个属性成为对象“组成”的一部分

我怎样才能做到这一点?

谢谢!

更新

以下是没有更详细的工作:

class Product < ActiveRecord::Base
     attr_reader :less_secure_asset_url

     def less_secure_asset_url
       self.asset.url
     end
end

>> p = Product.find(:all)[1]
=> #<Product id: 49, asset_file_name: "Etrade_Trade_Conf_Request.docx", asset_content_type: "application/vnd.openxmlformats-officedocument.wordp...", asset_file_size: 38152, asset_updated_at: "2010-05-04 17:45:46", created_at: "2010-05-04 17:45:46", updated_at: "2010-05-04 17:45:46", owner_id: 345, product_type_id: 1>

如您所见,当我使用控制台时,它不返回“less_secure_asset_url”属性

4

1 回答 1

0

你的属性在那里,即使它没有显示出来。Rails 将ininspect方法的定义重写为:ObjectActiveRecord::Base

  def inspect
     attributes_as_nice_string = self.class.column_names.collect { |name|
       if has_attribute?(name) || new_record?
         "#{name}: #{attribute_for_inspect(name)}"
       end
     }.compact.join(", ")
     "#<#{self.class} #{attributes_as_nice_string}>"
   end

基本上,如果它不是 column_name,它就不会出现。我还没有尝试过,但是您可能可以调用类似p.as(Object).inspect的方法来访问超类的检查方法。你必须require 'facets'得到。请参阅此处的文档。

于 2010-05-05T03:36:17.150 回答