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

Zac*_*ack 2 ruby postgresql activerecord ruby-on-rails jsonb

我有一个 postgres 表(用户),其中有一个 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) }
Run Code Online (Sandbox Code Playgroud)

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

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

这将通过以下方式完成scope :by_name, ->(name) { where("metadata @> ?", { session: { Primary: { FullName: name.to_s} } }.to_json) }

我怎样才能同时做这两件事?如果这只是简单的 activerecord 我知道我可以这样做:

User.where("full_name LIKE ? OR email LIKE", "%#{search}%","%#{search}%")
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*per 5

你可以这样做:

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