在我的rails控制器中,我写了
@all = Sunspot.search(Car, Article, Organization) do
fulltext params[:search]
end
@all_res = @all.results
然后我有这些数据:
[#<Car id: 25, vehicle_manufacturer_id: 2, vehicle_model_id: 2, price: 0, year: 1900, eng_capacity: 1, fuel_type_id: 2, gearbox_id: 2, wheeldrive_id: 2, is_not_rus: false, color_id: 3, vehicle_registration_id: 2, condition_id: 1, body_type_id: 3, is_exchangeable: false, is_not_sell: nil, is_right_wheel: false, is_without_run_in_russia: false, is_gt: false, is_new: false, is_hybrid: nil, has_ac: false, has_leather: false, has_alloy_wheels: false, has_el_packet: false, has_signalization: false, user_id: 3, description: "Кароче типо крутая тачка", created_at: "2014-03-18 18:20:51", updated_at: "2014-03-18 20:29:32", vehicle_mileage: 0, contact_name: "df sdf ", city_id: 3, telephone: "123123", is_vip: nil>, #<Article id: 6, meta_description: "dfsdf", meta_keywords: "dssd", title: "sdffsdf", tags: "1", intro_text: "sdfsdf", content: "sfsdf sdf sdf ds \r\nкрутая", author_id: 1, articles_type_id: nil, published: true, publishing_start: "2014-02-25 18:02:00", publishing_end: "2014-02-25 18:02:00", is_advert: true, created_at: "2014-02-25 18:03:07", updated_at: "2014-02-25 18:03:07", article_image_file_name: nil, article_image_content_type: nil, article_image_file_size: nil, article_image_updated_at: nil, rostov: nil, krasnodar: nil, stavropol: nil>]
但我怎么能显示这个呢?
例如,如果是汽车,那么查看一些字段,如果文章比其他字段在视图中搜索结果?也许是真的可以展示 - 这个词的位置是什么?答案 0 :(得分:3)
试试这个,它可能适合你的情况
@all.results.each do |result|
case result.class.name
when 'Car'
<%= result.vehicle_manufacturer_id %>
<%= result.vehicle_model_id %>
when 'Article'
<%= result.meta_description %>
<%= result.meta_keywords %>
end
end
答案 1 :(得分:0)
由于您在Car和Article模型之间没有任何共同的主要字段,因此您应该将搜索分开。这样,它允许您稍后添加更多条件以轻松缩小结果范围。
假设您想要搜索汽车和文章,以便于解释。
你可以有一个搜索汽车的页面,以及另一个搜索文章的页面。或者,如果您愿意,可以让一个页面包含一个搜索框,并让控制器的操作调用两个单独的搜索方法。然后,您将在两个实例变量中存储两个搜索结果。在视图中,您可以有两个结果部分,一个用于汽车,一个用于文章,分别循环遍历每个实例变量。
搜索者会是这样的:
#app/models/searcher.rb
class Searcher
def self.search_cars(term)
Car.search do
fulltext term
end
end
def self.search_articles(term)
Article.search do
fulltext term
end
end
end
答案 2 :(得分:0)
使用Rails'partial rendering(具体来说,rendering collections)你可以在你的视图中尝试这样的事情:
<%= render @all.results %>
默认情况下,它会根据集合中每条记录的类查找partial。您的结果数组包含Car
和Article
个对象,因此render
方法会查找cars/_car
和articles/_article
部分。
如果您想创建仅针对搜索结果的视图(例如,cars/_cars
partial将在别处用于其他目的),您可以在与您的搜索控制器对应的视图目录中创建其他部分
假设您的控制器为SearchResultsController
,相应的视图目录为search_results
。您可以在/app/views/search_results/
中创建以下部分:
_car.html.erb
_article.html.erb
_organization.html.erb
然后,在要显示结果的视图中,您可以执行以下操作:
<% @all.results.each do |result| %>
<%= render partial: "search_results/#{result.class.to_s.underscore}", object: result %>
<% end %>
使用object
选项,Rails会将该对象分配给与partial的名称匹配的局部变量。例如,您的第一个结果是Car
对象。此代码将查找search_results/_car
部分,并将Car
记录分配给可在部分中使用的car
变量:
# /app/views/search_results/_car.html.erb
<%= content_tag_for(:article, car) do %>
<%= debug car %>
<% end %>
答案 3 :(得分:0)
我们还可以使用is_a?
方法检查model
并为每个模型呈现相应的partial
。
<%= @all_res.each do |result| %>
<% if result.is_a?(Car) %>
<%= render 'car', car: result %>
<% elsif result.is_a?(Article) %>
<%= render 'article', article: result %>
<% elsif result.is_a?(Organization) %>
<%= render 'organization', organization: result %>
<% end %>
<% end %>
知道我迟到但这可能会有所帮助:)