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)。