2017-11-10 99 views
0

我有以下查詢......當搜索一個分數時,這是否是正確的Rails查詢?

CourseRegistration.where(status: "Completed").where("score >= ?", "80") 

首先,是的,比分字段是一個數據庫中的字符串。然而,這[主要]作品中,有100個沒有被返回。我可以查詢.where("score >= ?", "080"),它確實按照我的意願返回了80-100分的所有分數,但它的確感覺不錯。還有另外一種方法我應該這樣做嗎?或者,也許有人可能會試圖解釋這個查詢是如何工作的,所以我感覺更好。

+0

你將分數存儲爲文本嗎?爲什麼不簡單'CourseRegistration.where(status:「Completed」)。where(「score> =?」,80)' – lad2025

+0

你的分數數據類型是什麼? –

+0

Score是一個字符串。 – Lumbee

回答

2

您應該這樣做的方法是將score列更改爲整數,以便事情按預期工作。如果你不能做到這一點,那麼你可以施放分數查詢:

where("score::int >= ?", 80)   # PostgreSQL-specific casting syntax 
where("cast(score as int) >= ?", 80) # Standard SQL type cast 

當然,如果score列可以包含非數字的字符串,然後你會從這種查詢得到異常所以你可能需要說明這一點。你如何解釋這些數據取決於你需要處理的奇怪數據。

+0

是的!我使用的是postgres,這樣第一個例子就完美了。 – Lumbee

2

我建議你將分數列的類型改爲整數。你可以這樣做產生像遷移:

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

希望這會有所幫助,祝你好運!