【问题标题】:Multiple where clauses in Rails 4 returning no recordsRails 4 中的多个 where 子句不返回任何记录
【发布时间】:2014-01-26 20:27:03
【问题描述】:

我正在实现搜索,并希望让用户可以选择多个复选框来搜索这些选项。选择多个复选框时,将使用AND操作符,因此将返回所选每个选项的所有记录。

在选择一个复选框时,下面的代码会在选择一个复选框时,但它始终选择多个复选框时返回0个记录。你能帮忙吗?

代码如下:

用户.rb

  has_many :marketing_assets
  has_many :marketing_platforms, through: :marketing_assets

def self.has_platform(platform_object)
    where('marketing_platforms.name = ?', platform_object)

  end

  def self.search_for_platforms(platforms)
    @platforms = MarketingPlatform.all
    platforms_query_string = User
    platforms.each do |platform|
      @platforms.each do |platform_from_table|
        if platform == platform_from_table.name
          platforms_query_string = platforms_query_string.has_platform(platform_from_table.name)

        end
      end
    end
    return platforms_query_string
  end

experts_controller.erb

class ExpertsController < ApplicationController
  layout 'experts'

  def index


    @marketing_platforms = MarketingPlatform.all


    if params[:marketing_platforms_p].present?
      @users = User.joins(:marketing_platforms).search_for_platforms(params[:marketing_platforms_p])

      #@users = User.search_for_platforms(params[:marketing_platforms_p])
    else
      @users = User.text_search(params[:query]).page(params[:page]).per_page(10)

    end

  end
  def show
    @user = User.find(params[:id])
  end
end

experts.index.html.erb

<h1>Search</h1>

<%= params %>

<%= form_tag experts_path, method: :get do %>
    <p>
      <%= text_field_tag :query, params[:query] %>
    <hr>
    <h3>Marketing Assets</h3>

    <% MarketingPlatform.all.each do |platform| %>
        <%= check_box_tag "marketing_platforms_p[]", "#{platform.name}",
                          ((params[:marketing_platforms] != nil) && (params[:marketing_platforms].index(platform.name) != nil) ? true : false) %>
        <%= platform.name %>
    <% end %>


    <hr>
    <%= submit_tag 'Search', class: 'btn btn-primary', name: nil %>
    <%= link_to 'Find All', experts_path %>
    </p>
<% end %>


<h3>Results</h3>
<table class="table">
  <thead>
  <tr>
    <th>First name</th>
    <th>Last name</th>
    <th>Company</th>
    <th>Job title</th>
    <th>Country</th>
    <th>Email</th>
    <th></th>
  </tr>
  </thead>

  <tbody>
  <%= @users.count %>
  <% @users.each do |user| %>
      <tr>
        <td><%= user.first_name %></td>
        <td><%= user.last_name %></td>
        <td><%= user.company %></td>
        <td><%= user.job_title %></td>
        <td><%= user.country %></td>
        <td><%= user.email %></td>

        <td><%= link_to 'Show', expert_path(user) %></td>
      </tr>
  <% end %>
  </tbody>
</table>

正在执行的SQL是

SELECT COUNT(*) FROM "users" INNER JOIN "marketing_assets" ON "marketing_assets"."user_id" = "users"."id" INNER JOIN "marketing_platforms" ON "marketing_platforms"."id" = "marketing_assets"."marketing_platform_id" WHERE (marketing_platforms.name = 'Google+') AND (marketing_platforms.name = 'Facebook')

【问题讨论】:

  • 你有什么问题?
  • 嗨@depa 我已经添加了这个问题。对此感到抱歉

标签: sql ruby-on-rails ruby-on-rails-4 where-clause active-record-query


【解决方案1】:

我通过阅读以下问题Select Multiple Values From Single Column找到了这个问题的答案

我写了如下 SQL:

SELECT "users".* 
FROM "users"  
WHERE "users"."id" 
IN (SELECT "users"."id" FROM "users"  
INNER JOIN marketing_assets ON users.id = marketing_assets.user_id 
WHERE  marketing_assets.marketing_platform_id= 3 
GROUP BY users.id HAVING COUNT(DISTINCT marketing_assets.marketing_platform_id) = 1)

我构建了 query 对象,用变量替换所有值,然后使用 find_by_sql Rails 方法执行它:

@user = User.find_by_sql(**query**)

【讨论】:

    猜你喜欢
    • 2014-09-03
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多