在搜索分数时,这是正确的Rails查询吗?
我有以下查询……
CourseRegistration.where(status: "Completed").where("score >= ?", "80")
首先,是的,得分字段是数据库中的字符串。 这[大部分]有效,然而,100分未归还。 我可以查询.where("score >= ?", "080")
,它确实可以根据我的需要从80-100返回所有分数,但它确实感觉非常正确。 还有其他方法我应该这样做吗? 或者,也许有人可能会准确地解释这个查询是如何工作的,所以我觉得它更好。
你应该这样做的方法是将score
列更改为整数,以便按预期工作。 如果你不能这样做,那么你可以在查询中输出分数:
where("score::int >= ?", 80) # PostgreSQL-specific casting syntax where("cast(score as int) >= ?", 80) # Standard SQL type cast
当然,如果score
列可以包含非数字字符串,那么您将从这种查询中获得exception,因此您可能需要考虑这一点。 如何计算此类数据取决于您必须处理的奇怪数据。
我建议你将得分列类型更改为整数。 您可以这样做生成迁移,如:
rails g migration ChangeScoreType
然后编辑您的迁移文件,如下所示:
class ChangeScoreType < ActiveRecord::Migration change_column :course_registrations, :score, :integer, using: 'company_id::integer' end
此外,您可以在您的查询中将得分作为INT(应该测试)。 像这样的东西:
CourseRegistration.where(status: "Completed").where("CAST(Score AS INT) >= ?", "80")
希望这有帮助,祝你好运!