合并具有不同列的ActiveRecord :: Relation数组

时间:2013-10-09 04:29:09

标签: ruby-on-rails activerecord

我正在尝试合并两个ActiveRecord :: Relation数组,将搜索结果放在一起,这些搜索结果包含问题和答案。我需要结果是单个ActiveRecord :: Relation数组的形式,所以我可以进一步操作它。

以下是代码:

question_results = Question.where("(body || title) LIKE ?", "%#{@search}%")
answer_results = Answer.where("body LIKE ?", "%#{@search}%").group("question_id")
questions = question_results.merge(answer_results)

当我这样做时,我收到以下错误:

SQLite3::SQLException: no such column: question_id: SELECT "questions".* FROM "questions"  WHERE ((body || title) LIKE '%cosby%') AND (body LIKE '%cosby%') GROUP BY question_id

这种情况正在发生,因为这两个表有不同的列,特别是因为问题没有question_id列。

是否可以将这两个结果合并为一个搜索结果并仍然可以返回ActiveRecord :: Relations?我该怎么办?

2 个答案:

答案 0 :(得分:1)

当两个表之间存在可用映射时,您可以使用连接从两个表中检索字段。说问题(:id,:body,:title)has_many答案(:id,:body,:title),然后你可以使用连接来获取所有字段:

Question
.joins(:answers)
.select('questions.id as question_id, answers.id as answer_id')
.where("questions.body ilike ? or questions.title ilike ?",keyword, keyword)
.where("answers.body ilike ? or answers.title ilike ?",keyword, keyword)
.order('question_id')

对于样本,我已经选择了几个字段,但您可以包含两个模型中的任何字段。还对具有相同字段名称的表使用别名(如question_id,answer_id)。

希望它有所帮助。

答案 1 :(得分:-1)

Relation对象可以转换为数组。这无法在之后使用任何ActiveRecord方法

questions = question_results + answer_results