Ruby on Rails find_by不区分大小写

问题描述 投票:1回答:3

我需要从2个参数中找到一条记录,但我需要其中一个不区分大小写。目前区分大小写的是

  c = Course.find_by(subject_area: area, cat_number: cat)

但我需要subject_area不区分大小写。我怎么做到这一点?

sql ruby-on-rails activerecord case-insensitive
3个回答
3
投票

它取决于数据库,您可能需要传入特定于db的SQL(而不是使用find_by)。你在用postrges吗?如果是这样,这通常会起作用:

Course.where("LOWER(subject_area) = ? AND cat_number = ?", area.downcase, cat)

或者你可以在每次保存一个新的时候将你的subject_area转换为downcase ...然后只需使用:

Course.find_by(subject_area: area.downcase, cat_number: cat)

我可能是错的,但目前不知道任何rails本地方式做一个不区分大小写的导轨find_by


0
投票

如果您需要将此属性设置为不区分大小写,那么正确的方法是确保它始终是模型中的特定属性

before_save { self.subject_area = subject_area.downcase }

您也可以将现有数据迁移为低级。

完成后,您的操作查找仍然需要确保area在查询中如建议的那样下降。 Course.find_by(subject_area: area.downcase, cat_number: cat)

选项2:我知道我忘记了这一点。假设你不想去迁移路径。只需定义一个范围。 http://guides.rubyonrails.org/v4.1/active_record_querying.html#scopes

scope :area_nocase, (area) -> { where("LOWER(subject_area) = ?", area.downcase) }

然后就可以使用它了

Course.area_nocase(area)cat.course.area_nocase(area)或链接它,但你需要。


0
投票

另一种选择可以

c = Course.find_by("LOWER(subject_area)= ? AND cat_number = ?", area.downcase, cat)
© www.soinside.com 2019 - 2024. All rights reserved.