#ruby-on-rails #ruby #postgresql #activerecord
Вопрос:
При выполнении простой операции выбора места с помощью activerecord выполните,
ActiveRecord::Base.connection.execute('select * from spree_variants where sku = "1SB-E4196-00";')
Я получил эту ошибку:
from /Users/abc/.rvm/gems/ruby-2.7.2@cboparts/gems/activerecord-6.0.3.5/lib/active_record/connection_adapters/postgresql/database_statements.rb:92:in `exec'
Caused by PG::UndefinedColumn: ERROR: column "1SB-E4196-00" does not exist
LINE 1: select * from spree_variants where sku = "1SB-E4196-00";
Почему он рассматривается "1SB-E4196-00"
как столбец, а не артикул? Ошибка кажется вводящей в заблуждение.
Ответ №1:
Потому что PostgreSQL ожидает, что строки будут заключены в одинарные кавычки. В то время как двойные кавычки имеют другое значение:
Существует второй тип идентификатора: идентификатор с разделителями или идентификатор в кавычках. Он формируется путем заключения произвольной последовательности символов в двойные кавычки («). Идентификатор с разделителями-это всегда идентификатор, а не ключевое слово.
Это означает, что если следующий запрос должен работать:
ActiveRecord::Base.connection.execute(
"select * from spree_variants where sku = '1SB-E4196-00';"
)
Кстати, если вы используете Rails и у SpreeVariant
вас есть модель, вы можете увидеть в консоли, как Rails форматирует и экранирует запрос следующим образом:
puts SpreeVariant.where(sku: '1SB-E4196-00').to_sql