2009-07-22 16 views
155

Nel mio modello User ho potuto avere:Rails has_many con nome alias

has_many :tasks 

e nel mio modello Task:

belongs_to :user 

Quindi, supponendo che la chiave esterna 'user_id' è stato immagazzinato in compiti tavolo, ho potuto utilizzare:

@user.tasks 

La mia domanda è, Come dichiaro il rapporto has_many tale che posso fare riferimento ad Attività di un utente come:

@user.jobs 

... o ...

@user.foobars 

Grazie un mucchio.

+7

sarei stancato di usare un'attività come un nome di classe - si tratta di una parola riservata Rails e potrebbe causare strani problemi lungo la strada: http://reservedwords.herokuapp.com/ –

+0

Ho avuto lo stesso problema @doctororange! –

risposta

303

dare a questo un colpo:

has_many :jobs, foreign_key: "user_id", class_name: "Task" 

nota, che viene utilizzato per :aspolymorphic associations.

+0

Grazie per aver incluso anche la chiave esterna - risolto il mio problema simile ma diverso. –

+2

Questo ha bisogno di qualcosa di speciale sul lato Attività o è il solito "appartiene" a? –

-49

Si potrebbe fare in due modi diversi. Uno è quello di utilizzare "come"

has_many :tasks, :as => :jobs 

o

def jobs 
    self.tasks 
end 

Ovviamente il primo sarebbe il modo migliore per gestirlo.

+0

Grazie, sembra perfetto. Purtroppo questo non ha funzionato: utente modello: has_many: compiti,: come =>: created_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- NoMethodError in TasksController # indice metodo non definito 'created_tasks 'per # doctororange

+35

: come viene utilizzato per le associazioni polimorfiche non per questo particolare problema ... –

+3

Il secondo metodo è in realtà abbastanza utile per creare un alias dell'associazione. – jpgeek

25

Si potrebbe anche usare alias_attribute se si vuole ancora essere in grado di fare riferimento a loro come compiti così:

class User < ActiveRecord::Base 
    alias_attribute :jobs, :tasks 

    has_many :tasks 
end 
Problemi correlati