如何在哪里查询rails模型中定义的方法



user.rb

scope :under_2500_value, -> { where(current_value: 0..2499) }
scope :under_5000_value, -> { where(current_value: 2500..4999) }
def current_value
value * available.count / 100
end

可用的是与用户表有关系的另一个表,如下所示。

has_many :users_availables
has_many :availables, through: :users_availables

在轨道控制台,如果我尝试

User.under_2500_value,返回错误如下:

ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column users.current_value does not exist
LINE 1: SELECT  "users".* FROM "users" WHERE (users.curr...

请帮我找出哪里出了问题

在问题中做了一些编辑,没有正确理解代码

答案1

scope :under_2500_value, -> { joins(:availables) { where('(value * availables.count / 100) in (?)', 0..2499) } }`

User.under_2500_value.last.current_value

上面的查询返回7500,但应该在2500以下。

因为current_value是一个实例方法,这意味着它只能像在User模型的实例(如User.last.current_value)中那样被调用,但在您的作用域中,您使用它就像它是users表中的一列一样。

您可以尝试在查询中计算值,并将in运算符与范围值一起使用;

scope :under_2500_value, -> { where('(value * available / 100) in (?)', 0..2499) }
scope :under_5000_value, -> { where('(value * available / 100) in (?)', 2500..4999) }

看到两个范围之间的相似性了吗?你可以做一个;

scope :under_value, ->(value) { where('(value * available / 100) in (?)', value) }
# To be used as
# User.under_value(0..2499)

请注意,如果您使用Postgres,您可以将value * available / 100计算作为生成的列(请参阅,它可能会转换为其他RDBMS)。

相关内容

  • 没有找到相关文章

最新更新