У меня есть следующие три модели: Пользователь, Проект и Присвоение.
Пользователь 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
, таким образом, я хотел бы знать, существует ли способ сделать это без него.
Наконец, я должен упомянуть, что я открыт для других проектов, если это не может быть сделано этот путь, и кто-то может думать о лучшем пути.
Вы всегда можете использовать 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}'
У вас есть другие метаданные данные в таблице назначений?
Если нет, я просто буду использовать HABTM и добавить вместо этого в таблицу STOMETE_ID к проектам, имеет смысл жить там в любом случае.
Если вам нужно / хотите использовать has_many: через вы могли бы посмотреть на использование named_scopes (разрешенные вариантами рельсов), чтобы вы могли сказать user.projects.complied
и user.projects.incomplete