在Sunspot结果中访问belongs_to关联数据

时间:2013-10-28 18:33:32

标签: ruby-on-rails ruby-on-rails-4 belongs-to sunspot-rails

我正在努力探索太阳黑子,并且无法在太阳黑子搜索结果中访问相关模型中的数据。

我有一个包含字段的房间模型:id,room_name,capacity,location_id。它看起来像这样:

class Room < ActiveRecord::Base

  belongs_to  :location

  searchable do
    text :room_name
  end

end

带有字段的位置模型:id,location_name。它看起来像这样:

class Location < ActiveRecord::Base

  has_many :rooms

end

我有一个如下所示的搜索控制器:

class SearchController < ApplicationController

  def later
    @search = Sunspot.search(Room)
    @results = @search.results
  end

end

我正在尝试渲染一个看起来像这样的视图:

<% @results.each do |result| %>
  <%= result.room_name %>  
  <%= result.capacity %>
  <%= result.location.location_name %> 
<% end %>

但是,当我访问/搜索/稍后

时,我收到以下错误
NoMethodError in Search#later
Showing ./app/views/search/later.html.erb where line #4 raised:
undefined method `locations' for #<Room id: 1, room_name: "Room 1", capacity: 6, location_id: 1>

如果没有第4行这完美地运作,问题似乎在于我正在接触位置模型。

我的理解是@results变量应该是一个有效的ActiveRecord对象,并允许我从相关模型访问数据,在本例中是Location?

2 个答案:

答案 0 :(得分:0)

因此,Rubyist的回答是可行的。但是,直到我在routes.rb中取消嵌套Rooms资源,它才能工作。

我不明白为什么嵌套路线会导致问题。

答案 1 :(得分:0)

你在Sunspot和Solr方面所做的任何事都没有错。

您的观点中的错误是因为您在Room对象上调用locations,它应该是location(因为房间属于某个位置)。

关于undefined method location_name for nil的错误是因为您尝试索引的Room实例没有关联的位置(即@ room.location为nil)。您可以将索引放在条件中(例如。location.location_name if location.present?或使用类似try的内容(例如location.try(:location_name))。