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


186

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

has_many :tasks

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

belongs_to :user

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

@user.tasks

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

@user.jobs

... или ...

@user.foobars

Спасибо куча


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

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

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

По словам Сэма, это неуместно, поскольку: для полиморфных ассоциаций.
Майкл К Мэдисон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.