Skip to content

Instantly share code, notes, and snippets.

@alpaca-tc
Created March 26, 2018 11:27
Show Gist options
  • Save alpaca-tc/67969893a0441ff2681c8642f32c1879 to your computer and use it in GitHub Desktop.
Save alpaca-tc/67969893a0441ff2681c8642f32c1879 to your computer and use it in GitHub Desktop.
# `where` 句に渡す値はRuby Worldでcastされていてもいいんじゃないのか、と思ったので意見が聞きたいです。
#
# いま、ARのカラムに暗号化を噛ませるgemを書いているのだけど、入力値が変換されずにクエリなるので、暗号化/復号化したクエリの値が一致せず辛い。
# 可能であれば、AR::Type::XXX#castでserialize時に値をcastしたい
# Boolean/Decimalなどはserialize時に一切castしない `def serialize(value); value end`
# Current: castされないため、入力値をそのままクエリに投げている
User.attribute(:id, :boolean)
User.where(id: 'string').to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` = 'string'
User.where(id: true).to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` = TRUE
# Expected: AR::Typeでキャストして、入力値を変換してからクエリに投げている
User.attribute(:id, :boolean)
User.where(id: 'string').to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` = TRUE
User.where(id: true).to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` = TRUE
---
# Integer/Date/Timeはcastされている。こっちの動作に統一したい
User.attribute(:id, :integer)
User.where(id: 'string').to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` = 0
User.attribute(:id, :date)
User.where(id: 'string').to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL
User.attribute(:id, :datetime)
User.where(id: 'string').to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL
@alpaca-tc
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment