"不在"用于活动记录

时间:2016-08-09 20:54:09

标签: mysql ruby-on-rails ruby rails-activerecord active-record-query

我有一个MySQL查询,我试图链接一个" NOT IN"在它的最后。

以下是使用Active Record在ruby中的样子:

not_in = find_by_sql("SELECT parent_dimension_id FROM relations WHERE relation_type_id  = 6;").map(&:parent_dimension_id)

      joins('INNER JOIN dimensions ON child_dimension_id = dimensions.id')
          .where(relation_type_id: model_relation_id,
                 parent_dimension_id: sub_type_ids,
                 child_dimension_id: model_type)
          .where.not(parent_dimension_id: not_in)

所以我试图做的SQL查询看起来像这样:

INNER JOIN dimensions ON child_dimension_id = dimensions.id
WHERE relations.relation_type_id = 5 
AND relations.parent_dimension_id 
NOT IN(SELECT parent_dimension_id FROM relations WHERE relation_type_id  = 6);

有人可以向我确认我应该使用该查询吗? 我链接在哪里?不是吗?

2 个答案:

答案 0 :(得分:3)

如果你真的想要

SELECT parent_dimension_id
FROM relations
WHERE relation_type_id = 6

作为子查询,您只需要将该SQL转换为ActiveRecord关系:

Relation.select(:parent_dimension_id).where(:relation_type_id => 6)

然后将其用作where调用中的值,方法与使用数组的方式相同:

not_parents = Relation.select(:parent_dimension_id).where(:relation_type_id => 6)

Relation.joins('...')
        .where(relation_type_id: model_relation_id, ...)
        .where.not(parent_dimension_id: not_parents)

当您使用ActiveRecord关系作为where中的值并且该关系选择单个列时:

r = M1.select(:one_column).where(...)
M2.where(:column => r)

ActiveRecord非常智能,可以将r的SQL内联为in (select one_column ...),而不是进行两次查询。

你可以替换你的:

joins('INNER JOIN dimensions ON child_dimension_id = dimensions.id')
如果您的关系也已设置,则使用更简单的joins(:some_relation)

答案 1 :(得分:0)

您可以使用值或值数组提供where子句,在这种情况下,它们将被转换为in (?)子句。

因此,查询的最后一部分可能包含映射:

.where.not(parent_dimension_id:Relation.where(relation_type_id:6).map(&:parent_dimension_id))

或者你可以准备一份声明

.where('parent_dimension_id not in (?)', Relation.where(relation_type_id:6).map(&:parent_dimension_id) )

基本上完全相同