Как создать виртуальные атрибуты только для чтения в моделях Ruby - PullRequest
0 голосов
/ 04 мая 2010

Я хотел бы создать виртуальный атрибут, который всегда будет включен, когда вы делаете model_instance.inspect. Я понимаю, что attr_reader даст мне то же самое, что и определение метода экземпляра, но я бы хотел, чтобы этот атрибут был частью "make" объекта

Как мне это сделать?

Спасибо!

UPDATE

Вот что не работает более подробно:

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"

1 Ответ

0 голосов
/ 05 мая 2010

Ваш атрибут находится там, даже если он не отображается. Rails переопределяет определение inspect метода Object в ActiveRecord::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

По сути, если это не имя столбца, оно не будет отображаться. Я не пробовал этого, но вы можете вызвать что-то вроде p.as(Object).inspect, чтобы перейти к методу проверки суперклассов. Вы должны require 'facets', чтобы получить как. Смотри документы здесь .

...