Столбцы с плавающей запятой в SQL: выберите «где x = 2.0», но «где x = 2.1» - нет - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть приложение Ruby on Rails с моделью Project, которая имеет атрибут wcag_version типа float.

Screenshot

Iесть запись с wcag_version = 2 и запись с wcag_version = 2.1:

Screenshot

Что я заметил, так это то, что Rails находит запись с wcag_version = 2, используя Project.where(wcag_version: 2.0):

[4] pry(#<WcagElementsController>)> Project.where(wcag_version: 2.0)
=> [
    [0] #<Project:0x007f9fa900c6e8> { :id => 1 ... }

Но он не находит запись с wcag_version = 2.1, используя Project.where(wcag_version: 2.1):

[5] pry(#<WcagElementsController>)> Project.where(wcag_version: 2.1)
=> []

Кажется, это проблема SQL, а не проблема Railsхотя.Сгенерированный SQL:

[6] pry(#<WcagElementsController>)> Project.where(wcag_version: 2.1).to_sql
=> "SELECT `projects`.* FROM `projects` WHERE `projects`.`wcag_version` = 2.1 ORDER BY `projects`.`name` ASC"

, который ничего не возвращает, если я выполню его вручную непосредственно в базе данных:

Screenshot

Что здесь происходит?Кстати, я использую MySQL.

1 Ответ

0 голосов
/ 25 сентября 2019

Имея дело с Rails, кажется, что я могу обойти эту проблему следующим образом:

Project.all.each do |project|
  if project.wcag_version >= reference_criterion.wcag_version
    # Do stuff
  end
end

Хотя это менее производительно, это избавляет меня от головной боли.

Радиполноты, вот оригинальный код:

Project.where("wcag_version >= #{reference_criterion.wcag_version}").each do |project|
  # Do stuff
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...