Несколько предложений where в Rails 4, не возвращающих записи

Я выполняю поиск и хочу дать пользователю возможность выбрать несколько флажков для поиска этих параметров. Когда выбрано несколько флажков, будет использоваться оператор И, чтобы все записи, содержащие каждую выбранную опцию, были возвращены.

Приведенный ниже код работает, когда выбран один флажок, но он всегда возвращает 0 записей, когда выбрано несколько флажков. Вы можете помочь.

Вот код:

User.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

<h2>Search</h2>

<%= params %>

<%= form_tag experts_path, method: :get do %>
 <p>
 <%= text_field_tag :query, params[:query] %>
 </p>
 <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 %>


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


<h3>Results</h3>

 <%= @users.count %>
 <% @users.each do |user| %>
 
 <% end %>
 <table>
 <thead>
 <tr>
 <th>First name</th>
 <th>Last name</th>
 <th>Company</th>
 <th>Job title</th>
 <th>Country</th>
 <th>Email</th>
 
 </tr>
 </thead>

 <tbody><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></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')
1 ответ

Я нашел ответ на этот вопрос, прочитав следующий вопрос. Выберите несколько значений из одной колонки.

Я написал следующий 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)

Я построил объект запроса, заменив все значения на переменные, а затем выполнил его с помощью метода find_by_sql Rails:

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

licensed under cc by-sa 3.0 with attribution.