Javascript 如何使用Typeahead返回关联模型的记录?
我正在使用gem,它是建立在和之上的。当用户在搜索栏中键入内容时,我使用它通过AJAX返回结果。现在,它搜索my modelJavascript 如何使用Typeahead返回关联模型的记录?,javascript,ruby-on-rails,json,typeahead.js,bloodhound,Javascript,Ruby On Rails,Json,Typeahead.js,Bloodhound,我正在使用gem,它是建立在和之上的。当用户在搜索栏中键入内容时,我使用它通过AJAX返回结果。现在,它搜索my modelProduct的实例,其中Product.name与搜索键匹配。这部分很好用 我要做的是返回一个关联的记录,以及原始结果。我的产品与商户有关系。例如,当我键入搜索键时,我希望结果也列出与每个产品关联的商户,如下所示: return "<div>" + product.name + product.merchant.name +</div>"; HT
Product
的实例,其中Product.name
与搜索键匹配。这部分很好用
我要做的是返回一个关联的记录,以及原始结果。我的产品
与商户
有关系。例如,当我键入搜索键时,我希望结果也列出与每个产品关联的商户,如下所示:
return "<div>" + product.name + product.merchant.name +</div>";
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>
更新:
我尝试在查询中包括商户
:
Product.includes(:merchants).where('name like ?', "%#{q}%")
然后尝试在结果中返回商户名称
:
return "<div>" + product.name + product.merchant.name </div>";
返回“+product.name+product.merchant.name”;
但是添加product.merchant.name
完全破坏了功能,所以现在我没有得到任何结果。您可以将用户id作为类似于所有者id的内容添加到产品中,然后您还可以使用
@owner = User.find_by(id: @product.owner_id)
尝试像这样在查询中包含商家
Product.includes(:merchants).where('name like ?', "%#{q}%")
当呈现为JSON时,必须显式地告诉ActiveModel序列化程序包含关联的对象
render:json=>@products,:include=>{:merchant=>{:only=>:name}但是product
作为javascript变量返回。我如何将其传递到rails查询?我更新了我的问题。我试图在结果中打印merchant.name,但是product.merchant.name
完全破坏了我的功能。我如何在结果中访问merchant
?尝试获取第一个商户名称。我假设re是产品和商家之间的多对多关系。使用“product.merchants.first.name”而不是“product.merchant.name”不,商家有很多产品,产品属于商家。不幸的是,我无法查看错误,因为这都是通过ajax完成的,但使用hraynaud的代码,product.merchant.name
最终起作用。
@owner = User.find_by(id: @product.owner_id)
Product.includes(:merchants).where('name like ?', "%#{q}%")