Active Record Query使用了"NOT IN"。

10 浏览
0 Comments

Active Record Query使用了"NOT IN"。

希望有一个简单的解决方案,不需要使用find_by_sql,如果没有的话,那就只能用这个了。

我找到了这篇文章,其中引用了这个代码:

Topic.find(:all, :conditions => { :forum_id => @forums.map(&:id) })

它与下面的代码相同:

SELECT * FROM topics WHERE forum_id IN (<@forum ids>)

我想知道是否有办法使用NOT IN来实现,例如:

SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>)

0
0 Comments

自从Rails 4以后,可以使用"NOT IN"来进行Active Record查询。以下是使用方式:

Topic.where.not(forum_id: _ids)

需要注意的是,_ids不应该是一个id列表,而是一个子查询。如果想要使用子查询,可以先执行如下代码获取forum_id:

_ids = Forum.where(/*whatever conditions are desirable*/).select(:id)

这样可以在一个查询中获取所有的结果,类似于如下的SQL语句:

select * from topic 
where forum_id in (select id 
                   from forum 
                   where /*whatever conditions are desirable*/)

另外需要注意的是,最好使用join来进行查询,这可能更有效率。但是一定要使用EXPLAIN来确认。

以上就是使用"NOT IN"的Active Record查询的方法和注意事项。

0
0 Comments

在Rails 4中,我们可以使用"not"语法来解决Active Record查询中使用"NOT IN"的问题。在之前的版本中,我们无法直接使用"not in"关键字来实现这样的查询。

例如,我们想要查询标题不是"Rails 3"和"Rails 5"的文章,我们可以使用下面的代码来实现:

Article.where.not(title: ['Rails 3', 'Rails 5'])

这样我们就可以轻松地实现"NOT IN"查询了。这种语法的出现是Rails 4版本中的一个新特性,它使我们的查询更加简洁和易读。

在之前的版本中,如果我们想要实现"NOT IN"查询,我们需要使用"where"方法和"not"方法的组合,代码如下:

Article.where.not(title: ['Rails 3', 'Rails 5'])

但是这种写法相对繁琐,不够直观。因此,Rails团队在Rails 4版本中引入了新的语法,使我们能够更方便地进行"NOT IN"查询。

这个新的语法的引入是Rails团队对开发者需求的回应,它简化了查询的写法,提高了代码的可读性和可维护性。我们不再需要使用冗长的代码来实现"NOT IN"查询,而是可以直接使用"not"语法来实现。

通过引入"not"语法,Rails 4版本解决了Active Record查询中使用"NOT IN"的问题。这个新的语法使我们的查询更加简洁和易读,提高了代码的可读性和可维护性。我们可以更方便地实现"NOT IN"查询,减少了开发的时间和工作量。

0
0 Comments

Active Record查询使用"NOT IN"的原因是为了在查询中排除特定的条件,以获取符合其他条件的记录。这种查询方法在Rails 4+和Rails 3中有不同的写法。

在Rails 4+中,可以使用以下代码来实现"NOT IN"查询:

Article.where.not(title: ['Rails 3', 'Rails 5'])

而在Rails 3中,需要使用以下代码来实现相同的查询:

Topic.where('id NOT IN (?)', Array.wrap(actions))

其中,actions是一个包含[1,2,3,4,5]的数组。

然而,这种查询方法在一些特定情况下会出现问题。当actions数组为空或为nil时,以上代码将会返回错误的结果。为了解决这个问题,可以使用以下方法:

1. 在Rails 3中,可以使用以下代码来处理空或nil的情况:

Topic.where('id NOT IN (?)', (actions.empty? ? '' : actions))

2. 在Rails 4+中,可以使用以下代码来处理空或nil的情况:

Topic.where('id NOT IN (?)', actions.presence || "")

3. 可以使用Squeel,一个在Active Record之上的DSL,来简化查询语句。使用Squeel,可以使用以下代码来实现"NOT IN"查询:

Topic.where{id.not_in actions}

4. 可以使用`Array.wrap(actions)`来确保actions是一个数组,如下所示:

Topic.where('id NOT IN (?)', Array.wrap(actions))

"NOT IN"查询的问题出现的原因是在处理空或nil的情况时出现错误。通过使用上述解决方法,可以避免这个问题,并正确地使用"NOT IN"查询。

0