Rails has_many con nome alias


186

Nel mio modello utente avrei potuto:

has_many :tasks

e nel mio modello di attività:

belongs_to :user

Quindi, supponendo che la chiave esterna 'user_id' fosse memorizzata nella tabella delle attività, potrei usare:

@user.tasks

La mia domanda è: come posso dichiarare la relazione has_many in modo tale da poter fare riferimento alle attività di un utente come:

@user.jobs

... o ...

@user.foobars

Grazie un mucchio.


7
Sarei stanco di usare Task come nome di una classe - è una parola riservata di Rails e potrebbe causare strani problemi lungo la strada: riservatowords.herokuapp.com
Joshua Pinter

Risposte:


362

Prova questo:

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

Si noti che :asviene utilizzato per le associazioni polimorfiche .


1
Grazie per aver incluso anche la chiave esterna - risolto il mio problema simile ma diverso.
Niels Abildgaard,

4
Questo ha bisogno di qualcosa di speciale sul lato Task o è il solito belongs_tosufficiente?
stella luminosa il

1
Cordiali saluti: questo funziona anche per associazioni has_and_belongs_to_many, solo che non è necessario il pezzo "chiave straniera"
David Moritz,

55

Puoi anche usare alias_attributese vuoi essere in grado di fare riferimento anche a loro come attività:

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

  has_many :tasks
end

3

Per completare la risposta di @ SamSaffron:

Puoi usare class_namecon foreign_keyo inverse_of. Personalmente preferisco il dichiarativo più astratto, ma è davvero solo una questione di gusti:

class BlogPost
  has_many :images, class_name: "BlogPostImage", inverse_of: :blog_post  
end

e devi assicurarti di avere l' belongs_toattributo sul modello figlio:

class BlogPostImage
  belongs_to :blog_post
end

0

Se usi has_many through e vuoi alias:

has_many :alias_name, through: model_name, source: initial_name

-61

Potresti farlo in due modi diversi. Uno è usando "come"

has_many :tasks, :as => :jobs

o

def jobs
     self.tasks
end

Ovviamente il primo sarebbe il modo migliore per gestirlo.


Grazie, sembra perfetto. Sfortunatamente questo non ha funzionato: MODELLO UTENTE: has_many: task,: as =>: Created_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- NoMethodError in TasksController # index metodo indefinito `Created_tasks 'per # <Utente: 0xb6050b5c>
Doctororange,

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

Questo non sembra appropriato, come ha detto Sam, come: è per le associazioni polimorfiche.
Michael K Madison,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.