2015-08-07 6 views
1

У меня есть 2 ассоциацииРельсы шина (elasticsearch) поиск через has_many ассоциации

belongs_to :author 
has_many :favorites 

Я задаюсь вопросом, почему этот пример работает:

tire.search(load: {include: [:author, :comments]}, page: params[:page], per_page: 8) do 
    query { string params[:query], default_operator: "AND" } if params[:query].present? 
    filter :term, author_id: ['111'] 
    sort { by :created_at, 'desc' } 
end 

И это одно не:

tire.search(load: {include: [:author, :comments]}, page: params[:page], per_page: 8) do 
    query { string params[:query], default_operator: "AND" } if params[:query].present? 
    filter :term, favorite_ids: ['567'] 
    sort { by :created_at, 'desc' } 
end 

Может ли кто-нибудь мне помочь?

ответ

0

Внешние ключи хранятся в дочернем столе, Rails соединяет эти две таблицы для вас.

Так что в этой модели есть атрибут author_id, потому что эта модель принадлежит. Внешние ключи для отношений фаворитов хранятся в таблице избранных. Пока вы можете сделать Model.first.favorites и получить соответствующий favorites, это из-за значения, сохраненного в последней таблице.

Model.first.author_id есть. Model.first.favorite_ids нет.

Если вы хотите запустить поиск по favorites_ids, вам нужно будет явно определить это в методе to_indexed_json.

Кроме того, tire был удален. Вы должны изучить миграцию на elasticsearch-rails, или мой любимый драгоценный камень, searchkick!

+0

К сожалению, я не могу переключиться на другой драгоценный камень. Как вы сказали, я добавил этот код 'def to_indexed_json to_json (include:: favorites) end', но это не дает мне никаких изменений. Что я делаю неправильно? – Extazystas

+0

Я не уверен, что вы можете просто использовать 'include' и объявлять детей. Можете ли вы попробовать добавить их так? 'def to_indexed_json favorite_ids: избранное.collect {| f | f.id} end'? –