2010-05-04 5 views
0

Je voudrais créer un attribut virtuel qui sera toujours inclus lorsque vous faites model_instance.inspect. Je comprends que attr_reader me donnera la même chose que la définition d'une méthode d'instance, mais j'aimerais que cet attribut fasse partie de la composition de l'objetComment créer des attributs virtuels en lecture seule dans les modèles Ruby

Comment puis-je accomplir cela?

Merci!

MISE À JOUR

Voici ce qui ne fonctionne plus en détail:

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> 

Comme vous pouvez le voir, quand j'utiliser la console, il retourne pas d'attribut "less_secure_asset_url"

+0

@bill brasky, joli nom d'utilisateur :) –

+0

@macek haha ​​merci :) –

+1

Question n'est pas claire. Le remplacement de "# inspect" est-il correct? Est-ce que 'attributes' renvoie cette valeur, etc ... Qu'essayez-vous d'accomplir? –

Répondre

0

Votre l'attribut est là, même s'il n'apparaît pas. Rails remplace la définition de la méthode inspect de Object dans ActiveRecord::Base à quelque chose comme:

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 

En fait, si ce n'est pas un nom_colonne, il ne va pas se présenter. Je n'ai pas essayé ceci, mais vous pourriez être capable d'appeler quelque chose comme p.as(Object).inspect pour arriver à la méthode d'inspection de super classes. Vous devez require 'facets' pour obtenir comme. Voir les documents here.

Questions connexes