Я отправляю свой ответ на основании предоставленной дополнительной информации. Приведенный ниже запрос должен соответствовать вашему требованию.
Job.all(:conditions=> [ "
jobs.user_id = ? OR
EXISTS (
SELECT *
FROM job_requests AS B
WHERE B.job_id = jobs.id AND B.user_id = ?
)", user_id, user_id ]
)
Если вам нужна эффективная версия того же запроса, используйте UNION.
sql = "
SELECT *
FROM jobs A WHERE A.user_id = ?
UNION
SELECT *
FROM jobs A, job_requests B
WHERE A.id = B.job_id AND B.user_id = ?
"
Job.find_by_sql(Job.send(:sanitize_sql_array, [sql, user_id, user_id]))
Первый запрос может быть преобразован в named_scope
.
class Job < ActiveRecord::Base
named_scope :for_user, lambda { |user_id| { :conditions=> [ "
jobs.user_id = ? OR
EXISTS (
SELECT *
FROM job_requests AS B
WHERE B.job_id = jobs.id AND B.user_id = ?
)", user_id, user_id ] }
}
end
Теперь вы можете использовать named_scope следующим образом:
Jobs.for_user(current_user)