【问题标题】:Ruby on Rails: After search, list not displaying all dataRuby on Rails:搜索后,列表未显示所有数据
【发布时间】:2012-10-10 11:11:20
【问题描述】:

我遇到了一个问题,即我在我的 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>

【问题讨论】:

    标签: ruby-on-rails ruby postgresql model controller


    【解决方案1】:

    试试这个语法:

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

    reference here.

    【讨论】:

    • 对不起,仍然没有变化。我应该发布我的日志还是提供帮助?
    • 如果我对force_reload 的理解是正确的,p.technols(force_reload=true)返回重新加载的关联,而不是重新加载到位,所以这不起作用。
    【解决方案2】:

    我以不同的形式遇到了同样的问题:Matching nested model association attribute with includes

    另请参阅this discussion on the globalize3 github issue page,在通过动态查找器搜索后尝试销毁记录时出现问题(在数据库中留下不匹配的关联)。

    问题在于您将加入限制为具有给定技术关联的项目(那些在search_tech_ids 中具有ids 的项目),所以这些是rails 返回的唯一行。 Rails 无法知道那里还有其他人。

    据我所知,最简单的解决方案就是在完成搜索后重新加载项目。在 search 方法的最后一行上方添加一行,如下所示:

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

    这将告诉 Rails 重新加载与每个项目相关的技术,包括它在搜索中不匹配的技术。我相信这应该适用于您的情况。

    更新

    经过多次尝试(参见 cmets)和@tommasop 的建议,解决方案是强制重新加载视图中的技术:

    t.technols(force_reload=true).each
    

    仍然不清楚为什么上面的重新加载方法不起作用。如果有人有任何见解,请告诉我,我很想知道。

    【讨论】:

    • 您好,感谢您的帮助。我添加了你的代码,没有任何变化。嗯
    • 老实说,我有点困惑,这不起作用。 @tommasop 的回答让我觉得这可能是一个缓存问题,参见例如这个:stackoverflow.com/questions/966012/…
    • 这是一个疯狂的猜测,但您可以尝试将重新加载包装在 uncached 块中,如下所示:uncached { _projects.each { |p| p.technols.reload } }?参考:railspikes.com/2008/8/18/…
    • 我刚刚尝试了您的代码uncached { _projects.each { |p| p.technols.reload } },仍然没有任何变化。这是一个奇怪的:/
    • 如果这不起作用,请尝试将查看代码 t.technols.each do |technol| 更改为 t.technols(force_reload=true).each do |technol|。这应该迫使视图在迭代它们时重新加载技术。
    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2018-12-20
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多