Rails has_many с псевдонимом

186

В моей модели User я мог бы иметь:

has_many :tasks

и в моей модели задач:

belongs_to :user

Затем, предположив, что внешний ключ 'user_id' был сохранен в таблице задач, я мог бы использовать:

@user.tasks

У меня вопрос, как мне объявить отношение has_many таким образом, чтобы я мог ссылаться на задачи пользователя как:

@user.jobs

... или ...

@user.foobars

Спасибо куча

doctororange
источник
7
Я бы устал от использования Task в качестве имени класса - это зарезервированное слово Rails и может вызвать странные проблемы в будущем: reservedwords.herokuapp.com
Джошуа Пинтер

Ответы:

362

Дайте этому шанс:

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

Обратите внимание, что :asиспользуется для полиморфных ассоциаций .

Сэм Шафран
источник
1
Спасибо, что также включили внешний ключ - решил мою похожую, но другую проблему.
Нильс Абилдгаард
4
Нужно ли что-то особенное на стороне Задачи или belongs_toдостаточно обычного ?
яркая звезда
1
К вашему сведению: это также работает для ассоциаций has_and_belongs_to_many, только для фрагмента «foreign_key» нет необходимости
Дэвид Мориц
55

Вы также можете использовать, alias_attributeесли вы все еще хотите иметь возможность ссылаться на них как на задачи:

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

  has_many :tasks
end
Pwnrar
источник
3

Чтобы завершить ответ @ SamSaffron:

Вы можете использовать class_nameлибо foreign_keyили inverse_of. Я лично предпочитаю более абстрактные декларативные, но на самом деле это просто вопрос вкуса:

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

и вам нужно убедиться, что у вас есть belongs_toатрибут дочерней модели:

class BlogPostImage
  belongs_to :blog_post
end
Ghis
источник
0

Если вы используете has_many и хотите использовать псевдоним:

has_many :alias_name, through: model_name, source: initial_name
А. Аскаров
источник
-61

Вы можете сделать это двумя разными способами. Одним из них является использование «как»

has_many :tasks, :as => :jobs

или

def jobs
     self.tasks
end

Очевидно, что первый будет лучшим способом справиться с этим.

Брент Кирби
источник
Спасибо, это звучит идеально. К сожалению, это не сработало: ПОЛЬЗОВАТЕЛЬСКАЯ МОДЕЛЬ: has_many: tasks,: as =>: made_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- NoMethodError в TasksController # index undefined метод `creation_tasks 'для # <Пользователь: 0xb6050b5c>
doctororange
4
Второй метод на самом деле весьма полезен для создания псевдонима ассоциации.
jpgeek
По словам Сэма, это неуместно, поскольку: для полиморфных ассоциаций.
Майкл К Мэдисон