Rails has_many com o nome alternativo

186

No meu modelo de usuário, eu poderia ter:

has_many :tasks

e no meu modelo de tarefas:

belongs_to :user

Supondo que a chave estrangeira 'user_id' estivesse armazenada na tabela de tarefas, eu poderia usar:

@user.tasks

Minha pergunta é: como declaro o relacionamento has_many para que eu possa me referir às tarefas de um usuário como:

@user.jobs

... ou ...

@user.foobars

Muito obrigado.

doctororange
fonte
7
Eu ficaria cansado de usar Task como um nome de classe - é uma Rails palavra reservada e pode causar problemas estranhos na estrada: reservedwords.herokuapp.com
Joshua Pinter

Respostas:

362

Faça uma tentativa:

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

Observe que isso :asé usado para associações polimórficas .

Sam Saffron
fonte
1
Obrigado por incluir também a chave estrangeira - resolvi meu problema semelhante, mas diferente.
Niels Abildgaard
4
Isso precisa de algo especial no lado Tarefa ou é o belongs_tosuficiente?
estrela brilhante
1
FYI: isso também funciona para as associações has_and_belongs_to_many só há necessidade da peça "foreign_key"
David Moritz
55

Você também pode usá- alias_attributelo se ainda quiser se referir a eles como tarefas:

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

  has_many :tasks
end
Pwnrar
fonte
3

Para completar a resposta de @ SamSaffron:

Você pode usar class_namecom foreign_keyou inverse_of. Pessoalmente, prefiro o declarativo mais abstrato, mas é realmente apenas uma questão de gosto:

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

e você precisa ter o belongs_toatributo no modelo filho:

class BlogPostImage
  belongs_to :blog_post
end
Ghis
fonte
0

Se você usa has_many through e deseja o alias:

has_many :alias_name, through: model_name, source: initial_name
A. Askarov
fonte
-61

Você poderia fazer isso de duas maneiras diferentes. Um é usando "como"

has_many :tasks, :as => :jobs

ou

def jobs
     self.tasks
end

Obviamente, o primeiro seria a melhor maneira de lidar com isso.

Brent Kirby
fonte
Obrigado, isso parece perfeito. Infelizmente, isso não funcionou: MODO USUÁRIO: has_many: tarefas,: como =>: created_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- NoMethodError no TasksController # índice método indefinido `created_tasks 'para # <User: 0xb6050b5c>
22110 doctororange
4
O segundo método é realmente bastante útil para criar um alias da associação.
jpgeek
Isso não parece apropriado, como Sam disse, como: é para associações polimórficas.
Michael K Madison