0

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>
4

2 に答える 2

2

次の構文で試してください。

_projects.each { |p| p.technols(force_reload=true) }
_projects

ここを参照してください

于 2012-10-10T13:25:53.793 に答える
1

別の装いで同じ問題が発生しました:ネストされたモデルの関連付け属性とインクルードの一致

globalize3 githubの問題ページにあるこのディスカッションも参照してください。ここでは、動的ファインダーで検索した後にレコードを破棄しようとしたときに問題が発生しました(DBに一致しない関連付けを残します)。

id問題は、特定のテクノロジアソシエーションを持つプロジェクト(にsが含まれるプロジェクト)への結合を制限しているsearch_tech_idsため、railsが返す行はそれらだけであるということです。Railsには他の人がいることを知る方法がありません。

基本的に私が知る限り、最も簡単な解決策は、検索の完了後にプロジェクトをリロードすることです。search次のように、メソッドの最後の行のすぐ上に行を追加します。

_projects.each { |p| p.technols.reload }
_projects

これにより、検索で一致しなかったテクノロジーを含む、各プロジェクトに関連付けられたテクノロジーをリロードするようにレールに指示されます。私はそれがあなたの場合にうまくいくはずだと信じています。

更新

多くの試み(コメントを参照)と@tommasopからの提案の後、解決策は、ビュー内のテクノロジーを次のように強制的にリロードすることでした。

t.technols(force_reload=true).each

上記のリロードアプローチが機能しなかった理由はまだ明らかではありません。誰かが何か洞察を持っているなら、私に知らせてください、私は聞きたいです。

于 2012-10-10T11:51:46.630 に答える