如何在ruby activerecord中使用通配符搜索postgres JSONb列

时间:2016-04-01 19:00:50

标签: ruby-on-rails ruby postgresql activerecord jsonb

我有一个postgres表(Users),它有一个JSONb列(元数据)。目前我正在通过电子邮件搜索用户,除了电子邮件必须完全匹配外,它的工作正常。

因此,如果用户有电子邮件bob@smith.com而我User.by_email("bob@smith.com"),那么它就会很棒。但我希望User.by_email("@smith.com")使用匹配的电子邮件返回所有用户。

在我的user.rb模型中,我有以下内容:

scope :by_email, ->(email) { where("metadata @> ?", { session: { Primary: { Email: email.to_s.downcase} } }.to_json) }

允许User.by_email(email)工作的原因。如何修改它以查找具有与传入的字符串匹配的电子邮件的所有用户?

第二部分是我希望能够按用户名搜索。

这可以通过scope :by_name, ->(name) { where("metadata @> ?", { session: { Primary: { FullName: name.to_s} } }.to_json) }

完成

我怎样才能同时做到这两件事?如果这只是简单的主动记录,我知道我可以做到:

User.where("full_name LIKE ? OR email LIKE", "%#{search}%","%#{search}%")

如何使用JSONb列执行此操作?

1 个答案:

答案 0 :(得分:1)

你可以这样做:

User.where("metadata->'session'->'Primary'->>'Email' LIKE ?", '%@smith.com')