Rails has_many с псевдонимом - PullRequest
176 голосов
/ 22 июля 2009

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

has_many :tasks

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

belongs_to :user

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

@user.tasks

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

@user.jobs

... или ...

@user.foobars

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

Ответы [ 4 ]

337 голосов
/ 22 июля 2009

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

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

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

42 голосов
/ 04 августа 2016

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

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

  has_many :tasks
end
1 голос
/ 14 июня 2019

Чтобы завершить ответ @ 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 голосов
/ 22 июля 2009

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

has_many :tasks, :as => :jobs

или

def jobs
     self.tasks
end

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

...