【问题标题】:Using an instance method in scope returns incorrect result在范围内使用实例方法返回不正确的结果
【发布时间】:2022-12-11 11:28:58
【问题描述】:

用户.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

在 Rails 控制台中,如果我尝试以下命令,它会返回 current_positions 为 75 的用户,但它应该返回 25 以下。

User.under_25_value

请帮我找到我要去哪里错了

样本数据

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

【问题讨论】:

  • valuepositions.available 字段包含什么?
  • @Vishal value 是 users 表中的字段, positions 是另一个表, available 是表中的字段。 value 和 available 都是整数数据类型。 users 表有 position_id 作为字段,它表示用户关联的位置。我在问题部分添加了示例数据。请检查
  • 您能否添加值为 75 且位于 under_25_value 范围内的记录。我仍然对你所做的计算感到困惑

标签: ruby-on-rails activerecord scope ruby-on-rails-5 instance-methods


【解决方案1】:

由于您的用户模型已经有一个 position_id 列指向您要为每个用户查询的位置,您可以定义一个 position 关联并更新您的代码,如下所示:

用户.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

【讨论】:

  • 每个用户可以有多个位置,position_id 键根据我们代码库中的场景而改变。因此,在 users_positions 下,我们跟踪用户拥有的所有位置。在实例方法current_positions position.available下,这里的position是用户记录中的当前位置id,available是位置对应的字段。
猜你喜欢
  • 2019-01-22
  • 1970-01-01
  • 2014-05-03
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多