Rails: Как создать has_many через ассоциацию с псевдонимом / class_name - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь преобразовать мой HABTM в has_many через отношения. Иногда приходится подключать одни и те же модели по-разному. Например, чтобы указать разные роли для авторов.

С HABTM я бы сделал это через объявление опции class_name. Так же как: -

class Project < ActiveRecord::Base
  has_and_belongs_to_many :curators, :class_name => :author, :through => :projects_curators
end

class ProjectsCurator < ActiveRecord::Base  
  attr_accessible :project_id, :author_id
  belongs_to :project
  belongs_to :author
end

class Author < ActiveRecord::Base
 has_and_belongs_to_many :projects, :through => :projects_curators
end

Но когда я превращаю все в has_many через:

class Project < ActiveRecord::Base
  has_many :project_curators
  has_many :curators, :class_name => :author, :through => :project_curators
end

class ProjectCurator < ActiveRecord::Base  
  attr_accessible :project_id, :author_id
  belongs_to :project
  belongs_to :author
end

class Author < ActiveRecord::Base
  has_many :project_curators
  has_many :projects, :through => :project_curators
end

, я получаю: Could not find the source association(s) :curator or :curators in model ProjectCurator. Try 'has_many :curators, :through => :project_curators, :source => <name>'. Is it one of :author or :project?

Когда я добавляю :source

has_many :curators, :class_name => :author, :through => :project_curators, :source => :author

Я получаю:

uninitialized constant Project::author

Как мне заставить это работать? Заранее большое спасибо!

1 Ответ

2 голосов
/ 22 января 2020

Понимание: опция источника has_one / has_many через Rails должна помочь вам

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

has_many :curators, :through => :project_curators, :source => :author

Как сказал кто-то из приведенного выше поста:

Самый простой ответ - название отношения в середине

...