为多个关联编写范围 - Rails 4

时间:2017-01-05 12:39:46

标签: ruby-on-rails

我在编写要展示的范围时遇到了挑战:

  • 属于具有属于特定用户的付款的事件的所有卡
  • 我目前能够使用event.rb文件中的范围scope :booked_events, -> (user) { joins(payments: :user).where(users: { id: user.id }) }显示所有属于特定用户的付款事件
  • 有些活动有卡片,有些活动没有
  

有人可以告诉我如何使用卡片显示所有活动   拥有属于特定用户的付款

event.rb

has_many :payments 
has_one :card
scope :booked_events_with_cards, -> (user) { joins(payments: :user).where(users: { id: user.id }) }

card.rb

belongs_to :event

payment.rb

belongs_to :event
belongs_to :user

user.rb

has_many :payments

我在card.rb文件中尝试了以下内容,但我不确定

belongs_to :event
has_many :payments, through: :event
scope :cards_belonging_to_booked_events, -> (user) { joins(payments: :event).where(users: { id: user.id }) }

但得到以下错误:

2.3.0 :012 >   cards.cards_belonging_to_booked_events(user)
  Card Load (0.6ms)  SELECT "cards".* FROM "cards" INNER JOIN "events" ON "events"."id" = "cards"."event_id" INNER JOIN "payments" ON "payments"."event_id" = "events"."id" INNER JOIN "events" "events_payments" ON "events_payments"."id" = "payments"."event_id" WHERE "users"."id" = 4
SQLite3::SQLException: no such column: users.id: SELECT "cards".* FROM "cards" INNER JOIN "events" ON "events"."id" = "cards"."event_id" INNER JOIN "payments" ON "payments"."event_id" = "events"."id" INNER JOIN "events" "events_payments" ON "events_payments"."id" = "payments"."event_id" WHERE "users"."id" = 4
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: users.id: SELECT "cards".* FROM "cards" INNER JOIN "events" ON "events"."id" = "cards"."event_id" INNER JOIN "payments" ON "payments"."event_id" = "events"."id" INNER JOIN "events" "events_payments" ON "events_payments"."id" = "payments"."event_id" WHERE "users"."id" = 4

或者,我是否要在event.rb文件中写入范围,如果我想显示所有具有用户付款事件的卡片?

1 个答案:

答案 0 :(得分:1)

您只需要在card中加入joins关联。它会从查询结果中删除没有卡关联的事件:

scope :booked_events_with_cards, -> (user) { joins(:card, payments: :user).where(users: { id: user.id }) }