【问题标题】:Rails query join on regex正则表达式上的 Rails 查询连接
【发布时间】:2013-10-14 15:01:43
【问题描述】:

这是一个很少运行的查询(以管理员身份),不值得用 sphinx 索引/用完 RAM。

所以,变量设置如下: fn, ln, em = 'John', 'Smith', 'johnsmith@gmail.com'

查询是这样的:

profiles = Profile.joins(:user).where(:users=>{"email" => em}).
  where("first_name LIKE '%#{fn}%' AND last_name LIKE '%#{ln}%'")         

除了我希望电子邮件接受子字符串(例如,如果 em == 'th@gm',那么它应该匹配 'johnsmith@gmail.com')。您如何编写此代码以仅选择具有与正则表达式匹配的变量的用户进行连接?

【问题讨论】:

    标签: sql ruby-on-rails ruby regex join


    【解决方案1】:

    (我的灵感来自here):

    您是否尝试过类似的方法:

    profiles = Profile.joins(:user).where("first_name LIKE ? AND last_name LIKE ?", "%#{fn}%", "%#{ln}%")
    profiles.select{|p| p.user.email =~ /#{em}/}
    

    【讨论】:

    • 这可能不如纯 SQL 解决方案有效。这是否值得担心取决于有多少配置文件可能与where 子句匹配,但不会通过电子邮件测试。如果只是少数,这可能是一个很好的解决方案。如果有很多,那就更少了。
    • 好吧,如果我们以效率为目标,最好使用存储过程。然而,由于 ActiveRecord 的首要任务不是效率(这是一个 Rails 式的问题),我认为这是一个可行的答案。
    • 是的 - 这是一个很好的解决方案。这是一个必不可少的查询,但很少需要它并且对性能不重要。有很多用户,但目前可以在内存中处理 - 因此 ruby​​ select 似乎很合适。谢谢!
    • @muistooshort:你是对的。我只是在复制 OP 的代码。我会解决的。
    • mu,进行了搜索并最终查看了您以前的答案。你认为这对 SQL 注入安全吗? profile = Profile.where("first_name LIKE '%#{fn.gsub(/[!%_]/) { |x| '!' + x }}%' ESCAPE '!' AND last_name LIKE '%#{ln .gsub(/[!%_]/) { |x| '!' + x }}%' ESCAPE '!'")
    猜你喜欢
    • 2013-01-16
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多