【发布时间】:2017-04-20 21:22:30
【问题描述】:
我正在使用twitter-typeahead-rails gem,它是基于typeahead 和bloodhound 构建的。当用户在搜索栏中输入内容时,我使用它通过 AJAX 返回结果。现在,它搜索我的模型Product 的实例,其中product.name 与搜索键匹配。这部分效果很好。
我想要做的是返回关联记录以及原始结果。我的Product 与Merchant 有belongs_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>
宝石文件
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 会完全破坏该功能,所以现在我根本没有得到任何结果。
【问题讨论】:
标签: javascript ruby-on-rails json typeahead.js bloodhound