Определение внешнего ключа в has_many: через отношения

У меня есть следующие три модели: Пользователь, Проект и Присвоение.

Пользователь has_many Проекты через присвоение. Однако Присвоение на самом деле имеет два внешних ключа, которые касаются Пользователя: user_id (представление пользователя, которому присвоили проект), и completer_id (представление пользователя, который завершил проект).

Часто, user_id и completer_id будет то же (если пользователь, которому присвоили проект, завершит его). Однако, если другой пользователь завершает его, user_id, и completer_id будет отличаться.

В моей модели User у меня есть следующее:

class User < ActiveRecord::Base
  has_many   :assignments
  has_many   :incomplete_assignments, :class_name => 'Assignment',
    :conditions  => 'completer_id IS NULL'
  has_many   :completed_assignments, :class_name => 'Assignment',
    :foreign_key => 'completer_id'

  # this is the important one
  has_many   :incomplete_projects,
    :through     => :assignments,
    :source      => :project,
    :conditions  => 'completer_id IS NULL'
end

Я хотел бы сделать другую ассоциацию, названную :completed_projects, который использует completer_id как внешний ключ для Пользователя в :through модель, а не :user_id. Действительно ли возможно сделать это?

И, как в стороне, я знаю :foreign_key опция. Однако эта опция проигнорирована при использовании :through, таким образом, я хотел бы знать, существует ли способ сделать это без него.

Наконец, я должен упомянуть, что я открыт для других проектов, если это не может быть сделано этот путь, и кто-то может думать о лучшем пути.

6
задан hobodave 18 January 2010 в 06:08
поделиться

2 ответа

Вы всегда можете использовать SQL для выбора, если Activerecord не может легко выразить отношения из коробки:

has_many :completed_projects,
:class_name => "Project",
:finder_sql => 'SELECT p.* FROM projects p ' +
  'INNER JOIN assignments a ON p.id=a.project_id ' +
  'INNER JOIN users u on u.id=a.completer_id ' +
  'WHERE u.id=#{id}'
3
ответ дан 17 December 2019 в 04:47
поделиться

У вас есть другие метаданные данные в таблице назначений?

Если нет, я просто буду использовать HABTM и добавить вместо этого в таблицу STOMETE_ID к проектам, имеет смысл жить там в любом случае.

Если вам нужно / хотите использовать has_many: через вы могли бы посмотреть на использование named_scopes (разрешенные вариантами рельсов), чтобы вы могли сказать user.projects.complied и user.projects.incomplete

]
2
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: