Я хочу моделировать такую взаимосвязь между моделями User и Event.Множественный охват has_many через отношения в Rails 4
Поэтому я начал со следующими классами:
class User < ActiveRecord::Base
...
end
class Attendance < ActiveRecord::Base
# with columns user_id and event_id
...
end
class Event < ActiveRecord::Base
has_many :attendances
has_many :users, :through => :attendances
...
end
До сих пор все в порядке: я могу назначить пользователей и посещаемости доступа. Но теперь я хочу привести государство в игру, чтобы я мог различать, например. между «посещением», «отсутствием отсутствия», ... пользователями. Моя первая попытка была:
class Event < ActiveRecord::Base
has_many :attendances
has_many :users, :through => :attendances
has_many :unexcused_absent_users, -> { where :state => 'unexcused' },
:through => :attendances,
:source => :user
...
end
(: источник должен быть указан, так как в противном случае он будет искать а принадлежит ассоциации под названием «unexcused_absent_users») Проблема здесь в том, что где-предикат оценивается по таблице " пользователи.
Я не знаю, как решить эту проблему «правильно», не вводя новые таблицы/модели соединений для каждого состояния. Тем более, что каждый пользователь может быть как раз в одном состоянии для каждого события, я думаю, что решение с одной моделью Attendance имеет смысл.
У вас есть идея, как это сделать правильно?
Я столкнулся с очень похожими проблемами и с тех пор зарегистрировал проблему в проекте Rails (https://github.com/rails/rails/issues/10945). Я не на 100% уверен, что это настоящая проблема или ошибка пользователя с моей стороны, но я закончил тем же способом, что и вы. Используя этот обходной путь, я столкнулся с некоторыми странными вещами. Например, я бы поспорил, что делал что-то вроде этого: 'Event.create! (Title: 'foo', unexcused_absent_user_ids: [1,2,3])' приводит к тому, что атрибут 'state' устанавливается на' nil'. Если вы хотите поднять мою проблему на github или получить дополнительную информацию о своем подходе, я бы хотел ее услышать. –
Я забыл упомянуть, что я использовал этот пример создания «Event», потому что я думаю, что он очень похож на то, что «EventController # create» может получать как POST со страницы, где пользователь добавляет событие и одновременно помещает людей, которые неисключенные. (т. е. как набор флажков с именами учеников) –