我有一个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列执行此操作?
答案 0 :(得分:1)
你可以这样做:
User.where("metadata->'session'->'Primary'->>'Email' LIKE ?", '%@smith.com')