Home > Enterprise >  Using an instance method in scope returns incorrect result
Using an instance method in scope returns incorrect result

Time:12-01

user.rb

has_many :users_positions
has_many :positions, through: :users_positions
//users table has position_id as a field, it represents the current position user is associated with

scope :under_25_value, -> { joins(:positions).where('(value * positions.available / 100) in (?)', 0..24) }
scope :under_50_value, -> { joins(:positions).where('(value * positions.available / 100) in (?)', 25..49) }
scope :over_50_value, -> { joins(:positions).where('(value * positions.available / 100) >= ?', 50) }

def current_positions
  value * position.available / 100
end

In the rails console, if I try the below command it returns users who have current_positions as 75 but it should have returned under 25.

User.under_25_value

Please help me find where I am going wrong

Sample Data

User id: 894, name: "Jack", value: 18, position_id: 3
Position id: 3, available: 100, name: 'Manager'

CodePudding user response:

Since your user model already has a position_id column that points to the positions you want to query for each user, you can define a position association and update your code like below:

user.rb

has_many :users_positions
has_many :positions, through: :users_positions
//users table has position_id as a field, it represents the current position user is associated with
has_one :position

scope :under_25_value, -> { joins(:position).where('(value * positions.available / 100) in (?)', 0..24) }
scope :under_50_value, -> { joins(:position).where('(value * positions.available / 100) in (?)', 25..49) }
scope :over_50_value, -> { joins(:position).where('(value * positions.available / 100) >= ?', 50) }

def current_positions
  value * position.available / 100
end
  • Related