'How to write active record using using scope

How to write active record for price less than or equal to and price less than or equal to by scope in Ruby?

I tried like this:

scope :price, -> (price_lteq_or_price_gteq) { where("price_paisas >= ? or price_paisas <= ?", price_lteq_or_price_gteq, price_lteq_or_price_gteq)}

Controller

def index
  @properties = Property.where(:status=>'1')
  @properties = @properties.status(params[:status]) if params[:status].present?
  @properties = @properties.price(params[:price_lteq]) if params[:price_lteq].present?
  @properties = @properties.price(params[:price_gteq]) if params[:price_gteq].present?
end

When I tried like this, I got query like this:

SELECT `properties`.* FROM `properties` WHERE
`properties`.`status` = '1' AND (price_paisas >= '000' or price_paisas <= '000')
AND (price_paisas >= '49900' or price_paisas <= '49900')

What I need is active record like this

SELECT `properties`.* FROM `properties` WHERE
`properties`.`status` = '1' AND
(price_paisas >= '000' and price_paisas <='49900')

How to do so?



Solution 1:[1]

Try this

Scope:

price_gteq = 0, price_lteq= 49900

scope :price, -> (price_lteq, price_gteq) { where("price_paisas >= ? or price_paisas <= ?", price_gteq, price_lteq)}

Controller:

def index
 @properties = Property.where(:status=>'1')
 @properties = @properties.status(params[:status]) if params[:status].present?
 @properties = @properties.price(params[:price_lteq],params[:price_gteq]) if params[:price_lteq] && params[:price_gteq] 
end

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 dp7