如何使用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 关联记录以及原始结果。我的 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>
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}}
我正在使用 twitter-typeahead-rails gem, which is built on typeahead and bloodhound。当用户在搜索栏中输入内容时,我用它来 return 结果 AJAX 。现在,它搜索我的模型 Product
的实例,其中 product.name
与搜索键匹配。这部分效果很好。
我想做的是 return 关联记录以及原始结果。我的 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>
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}}