Я пытаюсь использоватьasticsearch для поиска в произвольном тексте. Система разделена на «Список», «Лицо», «Учетная запись» До тех пор, пока я не добавил «Список» и «Лицо», после добавления учетной записи мой поиск работал правильно. После поиска, когда я пытаюсь просмотреть результат, он возвращает nilClass к учетной записи. файлы можно увидеть ниже:
list.rb
class List < ApplicationRecord
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
after_touch() { __elasticsearch__.index_document }
has_and_belongs_to_many :people, after_add: [ lambda { |a,c| a.__elasticsearch__.index_document } ],
after_remove: [ lambda { |a,c| a.__elasticsearch__.index_document } ]
has_many :accounts, through: :people
settings do
mappings dynamic: false do
indexes :name, type: :text
indexes :people, type: :object do
indexes :name , type: :text
end
indexes :accounts, type: :object do
indexes :name_account , type: :text
end
end
end
# Customize the JSON serialization for Elasticsearch
def as_indexed_json(options={})
self.as_json(
include: { people: { only: :name},
accounts: { only: [:name_account, :social_network}
})
end
end
account.rb
class Account < ApplicationRecord
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
belongs_to :person , touch: true
end
person.rb
class Person < ApplicationRecord
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
has_and_belongs_to_many :lists
has_many :accounts
after_update { self.accounts.each(&:touch) }
end
index . html .erb
<% @lists.each do |list| %>
<% list.people.each do |people| %>
<% people.accounts.each do |account| %>
<td><%= people.name %></td>
<td><%= list.name %></td>
<td><%= account.name_account %></td>
<td><%= account.social_network %></td>
</tr>
<% end %>
<% end %>
<% end %>
list_controller
class ListsController < ApplicationController
def index
query = params[:search_posts].presence && params[:search_posts][:query]
if query
@lists = List.search(query)
else
@lists = List.all
end
end
end
MessageError: undefined method 'each' for nil:NilClass in <% people.accounts.each do |account| %>