2009-07-22 10 views
155

En mi modelo de usuario que podría tener:rieles has_many con nombre de alias

has_many :tasks 

y en mi modelo de tarea:

belongs_to :user 

Entonces, suponiendo que la clave externa 'user_id' fue almacenado en las tareas mesa, que podría utilizar:

@user.tasks 

Mi pregunta es, ¿Cómo declaro la relación has_many tal que puedo hacer referencia a las tareas de un usuario como:

@user.jobs 

... o ...

@user.foobars 

Gracias un montón.

+7

estaría cansado de usar tarea como un nombre de clase - es una palabra reservada de rieles y podría causar problemas extraños en el camino: http://reservedwords.herokuapp.com/ –

+0

¡Tuve el mismo problema @doctororange! –

Respuesta

303

dar a este un tiro:

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

Nota, que se utiliza para :aspolymorphic associations.

+0

Gracias por incluir también la clave externa: resolví mi problema similar pero diferente. –

+2

¿Necesita esto algo especial en el lado de la tarea o es suficiente el 'belongs_to' habitual? –

-49

Puede hacer esto de dos maneras diferentes. Una de ellas es mediante el uso de "como"

has_many :tasks, :as => :jobs 

o

def jobs 
    self.tasks 
end 

Obviamente, la primera de ellas sería la mejor manera de manejar la situación.

+0

Gracias, eso suena perfecto. Desafortunadamente esto no funcionó: usuario del modelo: has_many: tareas,: as =>: created_tasks CONTROLADOR: @created_tasks = @ user.created_tasks ----- NoMethodError en TasksController N.º Método undefined 'created_tasks 'para # doctororange

+35

: como se usa para las asociaciones polimórficas, no para este problema en particular ... –

+3

El segundo método es bastante útil para crear un alias de la asociación. – jpgeek

25

También es posible usar alias_attribute si todavía quiere ser capaz de hacer referencia a ellos como tareas, así:

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

    has_many :tasks 
end 
Cuestiones relacionadas