【发布时间】:2019-01-13 07:42:09
【问题描述】:
我正在 Rails 中构建一个日历应用程序。
可以邀请人们参加活动。
我在编写 @event.attending_users 之类的查询时遇到了困难。
日历事件由一个或多个 RecurringEvents 组成。一个 RecurringEvent 有一个或多个参加者。与会者表基本上是一个联接表,列出了参加 RecurringEvent 的用户。
活动
21 class Event < ApplicationRecord
24
25 has_many :recurring_events, dependent: :destroy
26 has_many :attendees, through: :reccurring_events
重复事件
23 class RecurringEvent < ApplicationRecord
24 has_many :comments, as: :commentable, dependent: :destroy
25 has_many :attendees, dependent: :destroy
26
27 belongs_to :event
与会者
13 class Attendee < ApplicationRecord
14 belongs_to :recurring_event
15 belongs_to :user
16
17 enum status: %w[unseen seen attending not_attending]
测试
23 RSpec.describe Event, type: :model do
24 before do
25 @user = Fabricate(:user)
26 @group = Fabricate(:group)
27 @event = Fabricate(:event, group: @group, user: @user, recurring: :weekly)
28 end
49 describe "Attending" do
50 before do
51 @user2 = Fabricate(:user, first_name: "Second User")
52 @group.add_member(user: @user)
53 @event.set_user_as_attending_all(@user)
54 end
app/models/event.rb
43 def set_user_as_attending_all(user)
44 return unless user.member_of? group
45 recurring_events.each do |recurring_event|
46 recurring_event.attend!(user)
47 end
48 end
要查看哪些用户正在参加活动,我正在尝试这样做:
RecurringEvent.joins(:event).where(event_id: id).joins(:attendees).where(status: "attending")
但这失败了,我不知道为什么:
*** ActiveRecord::StatementInvalid Exception: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
: SELECT "events".* FROM "events" ORDER BY "events"."id" DESC LIMIT $1
nil
*** ActiveRecord::StatementInvalid Exception: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
: SELECT "recurring_events".* FROM "recurring_events" INNER JOIN "events" ON "events"."id" = "recurring_events"."event_id" INNER JOIN "attendees" ON "attendees"."recurring_event_id" = "recurring_events"."id" WHERE "recurring_events"."event_id" = $1 AND "recurring_events"."status" = $2 ORDER BY "recurring_events"."id" ASC LIMIT $3
【问题讨论】:
标签: ruby-on-rails activerecord rails-activerecord