Нужна помощь с SQL-соединением в Rails - PullRequest
0 голосов
/ 17 января 2010

У меня есть таблица. Блог принадлежит Пользователю через user_id.

Я использую мышление sphinx для индексации блога, но я хочу, чтобы он только индексировал блоги, где пользователь в данный момент активен (user.status = User :: ACTIVE).

У меня есть код ниже для создания индекса, но я знаю, что предложение 'where' неверно. Что это должно быть?

define_index do
    indexes title
    indexes body

    where "user.status = '#{User::ACTIVE}'"
end

Обновление: Насколько я вижу, метод where просто передает код SQL в ядро ​​базы данных. Похоже, что это должно быть выполнимо путем передачи кода для JOIN, но я не знаю, какого SQL достаточно для создания оператора JOIN самостоятельно.

Второе обновление: Похоже, что при работе с SQL JOIN должен идти до WHERE, поэтому это невозможно сделать с помощью кода SQL, если кто-то не знает лучше.

Ответы [ 4 ]

1 голос
/ 17 января 2010

Возможно, вам следует попробовать пользователей (имена таблиц во множественном числе)

define_index do
    indexes title
    indexes body

    # Use this line, if status is numeric
    where "users.status = #{User::ACTIVE}"

    # ... and this one, if it's a string
    where "users.status = '#{User::ACTIVE}'"
end

В конце концов, вы можете взглянуть на руководство .

0 голосов
/ 17 января 2010

Я не верю, что предложение where поддерживает это. Это добавление к SQL за кулисами, но у него нет доступа к ассоциациям Rails. В качестве альтернативы можно также указать в записи блога поле статуса, которое зависит от пользователя.

Сначала добавьте поле статуса в таблицу блогов. Затем добавьте это к вашей модели пользователя:

before_save :update_blog_status

protected

def update_blog_status
  self.blog.update_attribute(:status, self.status)
end

Это автоматически обновит статус вашего блога. Я не знал, есть ли у одного пользователя блоги в блоге, так что если это так, просто измените этот код соответствующим образом.

Затем обновите свой индексатор блога с соответствующим предложением where:

define_index do
  indexes title
  indexes body

  where "status = '#{User::ACTIVE}'"
end

Это должно быть все, что вам нужно:)

0 голосов
/ 17 января 2010

Вам, вероятно, просто необходим фиктивный атрибут, чтобы убедиться, что sphinx присоединяется к блогу и пользовательским таблицам. Не зная специфики вашей схемы, попробуйте что-то вроде:

define_index do
    indexes title
    indexes body
    has user(:id), :as => :user_id

    where "users.status = '#{User::ACTIVE}'"
end
0 голосов
/ 17 января 2010

Я мало что знаю о сфинксе, но просто попытка в темноте.

users.status = '#{User::ACTIVE}'
...