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

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

has_many :tasks

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

belongs_to :user

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

@user.tasks

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

@user.jobs

... или...

@user.foobars

Спасибо кучу.

Ответ 1

Сделайте снимок:

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

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

Ответ 2

Вы также можете использовать 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

Ответ 4

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

has_many :tasks, :as => :jobs

или

def jobs
     self.tasks
end

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