如何发出ActiveRecord请求以获取其他几个项目共有的项目

时间:2018-06-21 08:54:15

标签: sql ruby-on-rails ruby activerecord sharetribe

我正在尝试修改Sharetribe,这是一种用于在线社区的Ruby on Rails框架。有一种方法可以为我返回相关的搜索过滤器。

就目前而言,如果它存在于任一类别(由category_ids标识)中,它将返回一个过滤器给我。

只要且仅当它存在于category_ids标识的所有类别中时,我希望它返回一个过滤器。

作为Rails和ActiveRecord的新手,我有点迷失了。这是返回相关过滤器的方法:

 # Database select for "relevant" filters based on the `category_ids`
  #
  # If `category_ids` is present, returns only filter that belong to
  # one of the given categories. Otherwise returns all filters.
  #
  def select_relevant_filters(category_ids)
    relevant_filters =
      if category_ids.present?
        @current_community
          .custom_fields
          .joins(:category_custom_fields)
          .where("category_custom_fields.category_id": category_ids, search_filter: true)
          .distinct
      else
        @current_community
          .custom_fields.where(search_filter: true)
      end

    relevant_filters.sort
  end

是否可以更改SQL请求,还是应该立即恢复所有字段,然后删除我不感兴趣的字段?

2 个答案:

答案 0 :(得分:0)

尝试以下

  def select_relevant_filters_if_all(category_ids)
    relevant_filters =
    if category_ids.present?
      @current_community
        .custom_fields
        .joins(:category_custom_fields)
        .where("category_custom_fields.category_id": category_ids, search_filter: true)
        .group("category_custom_fields.id") 
        .having("count(category_custom_fields.id)=?", category_ids.count)
        .distinct
    else
      @current_community
        .custom_fields.where(search_filter: true)
    end

    relevant_filters.sort
  end

这是您HomeController中的一种新方法,请注意名称不同,只是省略了monkeypatching。欢迎发表评论。

答案 1 :(得分:0)

因此,我通过选择在所选类别的所有子类别中都存在的过滤器解决了我的问题。为此,我选择了所有子类别的所有过滤器,并仅将返回的次数与子类别的数目完全相同。

  all_relevant_filters = select_relevant_filters(m_selected_category.own_and_subcategory_ids.or_nil)

  nb_sub_category = m_selected_category.subcategory_ids.size
  if nb_sub_category.none?
    relevant_filters = all_relevant_filters
  else
    relevant_filters = all_relevant_filters.select{ |e| all_relevant_filters.count(e) == nb_sub_category.get }.uniq
  end