在rails模型中编写大型SQL的更好方法是什么?

在使用Rails为糖代码提供的很多Arel之后,我在处理大型复杂的SQL查询时遇到了问题,而我无法用Arel方法做得很好。 我喜欢Arel的小东西,但是当它变得混乱时,我更喜欢分开代码。

那么,有什么建议我应该如何处理模型中的大型SQL ? 就像,我什么时候应该为此创建SQL视图 (因为我看到Rails不能很好地提供,我必须为此创建一个迁移)或在某个文件夹“sqls”中创建任何单独的类,然后从那里调用。

我知道有些人使用<< – SQL表达式

这是我目前的例子:

Question.from(self.questions .select("questions.id") .select("(NOT (questions.last_active_user_id = #{user.id} OR (COALESCE(ss.updated_at > questions.last_active_at, false) OR COALESCE(ds.updated_at > questions.last_active_at, false))))::integer as active") .select("(((NOT((COALESCE(ss.updated_at > questions.created_at, false) OR COALESCE(ds.updated_at > questions.created_at, false))) AND pages.owner_id = questions.user_id) OR (NOT (COALESCE(ss.updated_at > questions.owner_found_important_at, false) OR COALESCE(ds.updated_at > questions.owner_found_important_at, false)) AND owner_found_important_at is not null AND COALESCE(pages.owner_id  #{user.id}, true))) AND COALESCE(pages.owner_id  #{user.id}, true) AND (questions.last_active_user_id  #{user.id}))::integer as owner_active") .select("COALESCE(COUNT(answers.id) = 0, true)::integer as open") .joins("LEFT JOIN seens ss ON questions.slide_id = ss.viewed_id AND ss.viewed_type = 'Slide' AND ss.viewer_id = #{user.id}") .joins("LEFT JOIN seens ds ON questions.document_id = ds.viewed_id AND ds.viewed_type = 'Document' AND ds.viewer_id = #{user.id}") .joins("INNER JOIN documents ON documents.id = questions.document_id") .joins("INNER JOIN lists ON lists.id = documents.list_id") .joins("INNER JOIN pages ON pages.id = lists.page_id") .joins("LEFT OUTER JOIN answers ON answers.question_id = questions.id") .where("questions.reports_count  0 and questions.open > 0) THEN questions.open ELSE 0 END) as opened_active, SUM(CASE WHEN (questions.owner_active > 0 and questions.open > 0) THEN questions.owner_active ELSE 0 END) as opened_active_owner").first 

使用find_by_sql代替结合here文档:

 Questions.find_by_sql(<