alex
alex

Reputation: 5573

Rails: how to use scope inside has_many block in Model

In Rails 4 I am using:

class Ticket < ActiveRecord::Base

  has_many :request_attendances, dependent: :destroy

  has_many :attending_request_attendances, -> {
    where("data->>'rsvp_completed' = 'true'")
      .where("data->>'is_coming' = 'true'")
  }, class_name: 'RequestAttendance'

end

In my Tickets model

And

class RequestAttendance < ActiveRecord::Base

  belongs_to :tickets, inverse_of: :request_attendances

  scope :is_coming, -> { where("data->>'is_coming' = 'true'")}
  scope :rsvp_completed, -> { where("data->>'rsvp_completed' = 'true'")}

end

In my RequestAttendance model

I would like to do something like this

has_many :attending_request_attendances, -> {
  :is_coming
  :rsvp_completed
}, class_name: 'RequestAttendance'

To reuse the scope I have created in my RequestAttendance model.

Is something like this possible, at the moment it does not work, giving me the following error:

undefined method `except' for :rsvp_completed:Symbol

If I add a where to the has_many block like this:

has_many :attending_request_attendances, -> {
  :is_coming
  :rsvp_completed
  where("data->>'rsvp_completed' = 'true'")
}, class_name: 'RequestAttendance'

It does not error, however it also does not use the scope clauses either.

Upvotes: 0

Views: 3131

Answers (2)

Thanh
Thanh

Reputation: 8604

You can chain scopes together inside an association like this:

has_many :attending_request_attendances, -> { 
  is_coming.rsvp_completed 
}, class_name: 'RequestAttendance'

Upvotes: 2

Ajaykumar
Ajaykumar

Reputation: 416

You have added the below code in RequestAttendance model

scope :is_coming, -> { where("data->>'is_coming' = 'true'")}
scope :rsvp_completed, -> { where("data->>'rsvp_completed' = 'true'")}

if you use the below code in Tickets Model

class Tickets < ActiveRecord::Base
  has_many :RequestAttendance 
end

scopes are available to has_many associations so it will fetch all the records with is_coming' = 'true' and "data->>'rsvp_completed' = 'true'"

You can fetch it using object tickets.requestAttendance.is_coming.rsvp_completed

Is it your expectation or If I misunderstood pls explain

Upvotes: 0

Related Questions