如何使用Typeahead return记录关联模型?

How to return records of associated models using Typeahead?

我正在使用 twitter-typeahead-rails gem, which is built on typeahead and bloodhound。当用户在搜索栏中输入内容时,我用它来 return 结果 AJAX 。现在,它搜索我的模型 Product 的实例,其中 product.name 与搜索键匹配。这部分效果很好。

我想做的是 return 关联记录以及原始结果。我的 ProductMerchantbelongs_to 关系。因此,例如,当我输入搜索键时,我希望结果也列出与每个产品关联的商家,如下所示:

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}%")

然后尝试 returning 结果中的 merchant.name

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

但是添加 product.merchant.name 会完全破坏函数,所以现在我什么结果也没有。

您可以将用户 ID 添加到产品中,例如 owner_id,然后您也可以使用

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

尝试像这样在查询中包括商家

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

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

render :json => @products, :include => {:merchant=> {:only => :name}}