2013-11-08 1 views
0

У меня есть индекс, в котором я хочу отфильтровать некоторые атрибуты на основе некоторого состояния.Состояние мышления сфинкса в HAS

Ниже структура работает прекрасно

Class A 
attr_accessible :vaild_date 
belongs_to: B 
define_index 'index_for_a' do 
    indexes ... 
    ... 
    has B.C.plant_id, :as => :plant_id 
end 
end 

class B 
    has_many: C 
end 

class C 
    attr_accessible :plant_id,:month_timestamps 
end 

Теперь мой класс C имеет много строк. Я хочу иметь plant_id только для строк, где

C.month_timestamps = A.valid_date 

Пожалуйста, предложите некоторый подход для достижения этого. Будучи новым для think_sphinx, я не могу правильно использовать условия и предложения.

ответ

1

добавить

#Assuming Class C is stored in db as Cs 
    where "Cs.month_timestamps = valid_date" 

вашего define_index блока, как этого

define_index 'index_for_a' do 
    indexes ... 
    ... 
    has B.C.plant_id, :as => :plant_id 

    join B.C 
    #Assuming Class C is stored in db as Cs 
    where "Cs.month_timestamps = valid_date" 
end 

Update

Обновленного ответ с редактированием предложенного CrazyDiv

Update

Попробуйте что-то вроде этого

has "IFNULL(Cs.plant_id,0)", :as => :plant_id 
+0

Благодаря отлично работает. Не могли бы вы также сказать, как добавить нулевое состояние. то есть b.c.plant_id должен быть 0, когда нет строки в b.c. – crazydiv

+0

Все, что входит в двойные кавычки, является простым синтаксисом SQL. Например, вы можете написать 'has 'B.C.plant_id как plant_id" ', как раз так, как вы это делали с' where'. То же самое можно использовать и с «индексами». Поэтому я уверен, что вы можете понять, как это сделать. 'ts' фактически генерирует инструкцию' SQL' и выгружает ее в файл. Вы можете проверить это, чтобы узнать больше. – Litmus

+0

Спасибо. Не могли бы вы помочь мне в добавлении нулевого состояния. Я хочу, чтобы plant_id был установлен как ноль, когда нет строки в C. Я пытался с CASE КОГДА, но не повезло – crazydiv