2013-07-01 4 views
5

Ho il seguente problema nel mio rotaie app:Come accedere al nome del modello in una preoccupazione (o in un modulo)?

module Authenticable 
    extend ActiveSupport::Concern 

    included do 
    # ... 
    end 

    module ClassMethods 
    def quoted_table_name 
     self.class.name.downcase.pluralize # returns "classes" 
    end 
    end 
end 

Se ho una classe utente:

class User 
    include Authenticable 
end 

poi mi potrebbe piacere User.quoted_table_name tornare "users". Attualmente, User.quoted_table_name restituisce "classes". Ho anche provato a seguire, ma nulla è cambiato.

def quoted_table_name 
    Proc.new { self.class.name.downcase.pluralize }.call 
end 
+1

Forse è perché 'quoted_table_name' è già sul lato della classe. La classe della classe User è 'Class' (adoro quella frase!). Potresti provare un 'name.downcase.pluralize' – tessi

+0

Bella presa. Questo era il problema – Max

+0

Trasferito il commento in una risposta. Come in realtà era una risposta. Sono felice di poter aiutare :) – tessi

risposta

5

provare quanto segue:

module Authenticable 
    ... 

    module ClassMethods 
    def quoted_table_name 
     name.downcase.pluralize # returns "users" 
    end 
    end 
end 

self.class.name.downcase.pluralize non funziona, perché abbiamo già operiamo sulla classe lato del User di classe. Quando si richiede la classe User per la sua classe, viene restituito Class. Class.name.downcase.pluralize, tuttavia, è "classi".

0

A meno che non si dispone di un metodo name nel modello d'uso, che potrebbe molto probabilmente accadrà:

def name 
    [first_name, last_name].join 
end 

Così si potrebbe utilizzare self.table_name come in:

module Authenticable 
    ... 

    module ClassMethods 
    def quoted_table_name 
     self.table_name # returns "users" 
    end 
    end 
end 
Problemi correlati