当select语句中有if / else逻辑时优化ActiveRecord查询

时间:2017-03-26 17:54:12

标签: ruby-on-rails ruby activerecord

我有一个非常笨拙的查询,我试图优化。我想基于一些成员资格包逻辑返回用户记录的activerecord关联。

    if (str.charAt(i) == ' ' && ((i+1) < str.length()) && str.charAt(i+1)!=' ')

我遇到的问题是我必须进行两次查询,因为我不知道如何使用select来返回活动记录关联而不是数组。

  1. 如何从select?
  2. 返回activerecord关联
  3. 我是否有更好的方法在select块中组织逻辑?
  4. 编辑:

    经过一些重构后,我能够将一些选择逻辑移动到方法中:

    ```

    ids = User.joins(:memberships).includes(:memberships).select do |user|
      if user.memberships.count <= 1
        user.membership_packet_sent_at.blank?
      else
        user.membership_packet_sent_at.blank? && user.current_membership.created_more_than_30_days_ago?
      end
    end.uniq.map(&:id)
    
    User.where(id: ids)
    

    ```

    仍然遇到如何返回activerecord关联的问题

1 个答案:

答案 0 :(得分:1)

我认为目前无法在应用Relation后直接返回select个对象。

这些是我能想到的主要原因:

  • Relation对象只是一个SQL构建器,不能与实际数据一起使用
  • select方法允许执行无法表示为有效SQL查询的自定义进程,因此无法将select的结果与where之类的查询链接起来{ {1}}

This answer也提出了类似的思路。