我有一个用户数据库。他们都有邮政编码。
我正在尝试使用.where来抓取所有在100天之内并且邮政编码以“NR”开头的用户。
我尝试了下面的代码,但是我得到了postgres语法错误,可能是因为.where似乎接受了特定于数据库的语法而不是直接的ruby。
users = User.where('created_at < ? and postcode[0..1] = ?', 100.days.ago, "NR")
我似乎无法找到任何可以帮助我在线的东西。我甚至尝试创建一个数组并迭代保存匹配的记录,但是rails也无法将用户分配到一个数组,所以我把它装罐了。
这里有人可以给我任何指导吗?
答案 0 :(得分:2)
尝试:
users = User.where { |u| u.postcode.matches "NR%" && u.created_at < 100.days.ago }
不知道它来自哪里,所以尝试(虽然更多行):
user_tbl = User.arel_table
u = User.where(user_tbl[:postcode].matches("NR%"))
.where(user_tbl[:created_at].lt(100.days.ago))
答案 1 :(得分:1)
写为:
users = User.where('created_at < ? AND postcode LIKE ?', 100.days.ago, "NR%")
答案 2 :(得分:1)
编程时,您始终需要了解您正在为其编写代码的 context 。通常,您将同时使用HTML,JavaScript,Ruby和SQL,每个都有自己的语法和约定。
在这种情况下,您正在使用Postgres SQL,因此您需要的是Postgres函数来为您完成工作。这是一个字面翻译:
User.where('created_at < ? and LEFT(postcode, 2) = ?', 100.days.ago, "NR")
请务必熟悉Postgres string functions,因为其中有很多。
正如R_O_R在另一个答案中指出的那样,使用LIKE
是一个选项。