Railsアプリで、ユーザーがデータベース内のプロジェクトを検索できるようにする検索で、重複した結果が得られるという問題がありました。
プロジェクトモデルの検索機能は次のとおりです。
def self.search(search_industry, search_role, search_techs_ids)
_projects = Project.scoped
if search_industry.present?
_projects = _projects.where ['industry LIKE ?', like(search_industry)]
end
if search_role.present?
_projects = _projects.where ['role LIKE ?', like(search_role)]
end
if search_techs_ids.present?
_projects = _projects.includes(:technols).where("technols.id" => search_techs_ids)
end
_projects
end
これが私の検索ページの一部です
<div class="tech">
<%= fields_for(@project_technol) do |ab| %>
Technologies :
<% tech_ids = params[:technols][:id].reject(&:blank?) unless params[:technols].nil? %>
<%if params[:technols].nil?%>
<%= collection_select(:technols, :id, @all_technols, :id, :tech, {}, {:multiple => true} ) %>
<% else %>
<%= collection_select(:technols, :id, @all_technols, :id, :tech, {}, {:multiple => true, :selected => tech_ids } ) %>
<% end %>
</div>
これが私の検索アクションです:
def search
tech_ids = params[:technols][:id].reject(&:blank?) unless params[:technols].nil?
@search = params[:industry], params[:role], tech_ids
@project_search = Project.search(*@search).order(sort_column + ' ' + sort_direction).paginated_for_index(per_page, page)
@search_performed = !@search.reject! { |c| c.blank? }.empty?
@project = Project.new(params[:project])
@all_technols = Technol.all
@project_technol = @project.projecttechnols.build
respond_to do |format|
format.html # search.html.erb
format.json { render :json => @project }
end
end
その問題は現在分類されていますが、それを修正すると、単一のテクノロジーを検索すると、正しいプロジェクトが表に表示されますが、テクノロジーの列には、そのプロジェクトに属するすべてのテクノロジーが表示されますが、検索したものだけが表示されます:
<% @project_search.each do |t| %>
<tr>
<td><ul>
<% t.technols.each do |technol| %>
<li><%= technol.tech %><!/li>
<% end %>
</ul></td>
何か案は?私のモデルでは、テーブルを正しく表示するために機能するこのコードを使用していましたが、重複した結果が表示されました。
if search_techs_ids.present?
_projects = _projects.joins(:technols).where("technols.id" => search_techs_ids)
end
どんな助けでも大歓迎です。前もって感謝します
解決策以下の回答を参照してください
@shioyamaと@tommasopはどちらも問題の解決に役立ちました。
解決策は、列が作成される検索ビューを次のように変更することでした。
<td><ul>
<% t.technols(force_reload=true).each do |technol| %>
<li><%= technol.tech %></li>
<% end %>
</ul></td>