我正在使用基于twitter-typeahead-rails和typeahead构建的bloodhound gem。当用户在搜索栏中输入时,我用它来返回AJAX结果。现在,它会搜索我的模型Product
的实例,其中product.name
与搜索关键字匹配。这部分效果很好。
我要做的是返回相关记录以及原始结果。我的Product
与belongs_to
有Merchant
的关系。例如,当我输入搜索关键字时,我希望结果还列出与每个产品关联的商家,如下所示:
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
完全打破了这个功能,所以现在我根本没有得到任何结果。
答案 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)