nobilik
nobilik

Reputation: 736

How to define the scope?

I have:

price_plan.rb

class PricePlan < ActiveRecord::Base
  has_many :users
  scope :premium, lambda { where('price > ?', 0) }
  scope :free, lambda { where('price == ?', 0) }
end

user.rb

class User < ActiveRecord::Base
  belongs_to :price_plan
  has_one :account
  scope :free, lambda { joins(PricePlan.free) } #<--- no!
end

How to define scope for users, that use service free of charge? This below should work, but I don't like it.

scope :free,-> where(priceplan_id: PricePlan.free.pluck(:id))

Upvotes: 1

Views: 72

Answers (1)

Hieu Pham
Hieu Pham

Reputation: 6707

It will be

Solution 1: Use condition on relation

class User < ActiveRecord::Base
  # Your current code
  belongs_to :free_price_plan, -> { free }, class_name: 'PricePlan'
  belongs_to :premium_price_plan, -> { premium }, class_name: 'PricePlan'
end

Solution 2: Define a scope

class User < ActiveRecord::Base
  # Your current code
  scope :free, -> {
    joins(:price_plan).merge(PricePlan.free)
  }

  scope :premium, -> {
    joins(:price_plan).merge(PricePlan.premium)
  }
end

Upvotes: 2

Related Questions