如何使用Typeahead返回关联模型的记录?

时间:2017-04-20 21:22:30

标签: javascript ruby-on-rails json typeahead.js bloodhound

我正在使用基于twitter-typeahead-railstypeahead构建的bloodhound gem。当用户在搜索栏中输入时,我用它来返回AJAX结果。现在,它会搜索我的模型Product的实例,其中product.name与搜索关键字匹配。这部分效果很好。

我要做的是返回相关记录以及原始结果。我的Productbelongs_toMerchant的关系。例如,当我输入搜索关键字时,我希望结果还列出与每个产品关联的商家,如下所示:

return "<div>" + product.name + product.merchant.name +</div>";

但是现在,添加product.merchant.name会破坏功能,所以我认为商家没有被包含在JSON中。我该如何加入?

控制器

def typeahead
  q = params[:query]
  render json: Product.where('name like ?', "%#{q}%")
end

HTML / JS

<%= form_tag products_path, :method => :get do %>
  <%= text_field_tag :search, params[:search], id:"typeahead" %>
    <%= image_tag("Go.png", type:"submit") %>
<% end %>


<script type="text/javascript">
  $(document).ready(function(){
    var bloodhound = new Bloodhound({
      datumTokenizer: function (d) {
        return Bloodhound.tokenizers.whitespace(d.value);
      },
      queryTokenizer: Bloodhound.tokenizers.whitespace,
      remote: '/typeahead/%QUERY'
    });
    bloodhound.initialize();

    $('#typeahead').typeahead(null, {
      displayKey: function(product) {
        return "" + product.name + "";
      },
      source: bloodhound.ttAdapter(),
      templates: {
        suggestion: function (product) {
          var thing_url = "<%=root_url%>pages/"
          return "<div>" + product.name + </div>";
        }
      }
    });
  });
</script>

的Gemfile

gem 'twitter-typeahead-rails', '0.10.5'

更新

我尝试在查询中包含Merchant

Product.includes(:merchants).where('name like ?', "%#{q}%")

然后尝试在结果中返回merchant.name

return "<div>" + product.name + product.merchant.name </div>";

但是添加product.merchant.name完全打破了这个功能,所以现在我根本没有得到任何结果。

3 个答案:

答案 0 :(得分:1)

尝试在这样的查询中包含商家

Product.includes(:merchants).where('name like ?', "%#{q}%")

答案 1 :(得分:1)

当您渲染为JSON时,您必须明确告诉ActiveModel Serializer包含关联的对象。

渲染:json =&gt; @products,:include =&gt; {:商人=&GT; {:only =&gt; :名称}}

答案 2 :(得分:0)

您可以将用户ID添加到产品中,类似于owner_id,然后您也可以使用

进行查询
@owner = User.find_by(id: @product.owner_id)