Rails - 查找不存在另一个连接表的记录

时间:2011-01-27 15:43:26

标签: ruby-on-rails activerecord

我正在尝试写一个ActiveRecord语句,我正在查找其他表中没有id的所有记录...

语法是什么?

 @events =  Event.find(:all, :include => :personals, 
                  :conditions => ["event.id != ? ", @user.personal.event_id ])

其中,个人是具有user_id和event_id ....

的联接表

所以我基本上试图找到用户没有添加到他们自己的个人记录集中的每个事件记录....

有没有更好的方法来写这个....不是null或什么?

3 个答案:

答案 0 :(得分:7)

我假设关系如下:

User: 
has_many :personals
has_many :events, :through => :personals

Event:
has_many :personals
has_many :users, :through => :personals

Personal:
belongs_to :event
belongs_to :user

我的解决方案是使用自动创建的User“event_ids”关联函数,列出User.events中的所有事件ID。获取您要执行的操作的查询应该是:

Event.find(:all, :include => :personals, :conditions => ["events.id NOT IN (?)", @user.event_ids])

而且,除非您确实需要加入,否则您可以简化:

Event.find(:all, :conditions => ["events.id NOT IN (?)", @user.event_ids])

关键是SQL命令“NOT IN(x)”。另外,请注意,根据SQL惯例,“events.id”是模型名称的复数形式。

希望这会有所帮助......

答案 1 :(得分:7)

Nuby提出的解决方案与以往一样正确。这是现代语法中的相同查询,可以在Rails 3及更高版本中使用:

Event.where.not(id: @user.event_ids)

答案 2 :(得分:1)

其他答案在成千上万个或更多记录中无法很好地扩展。这是一个纯SQL解决方案。

路轨5:

Event.left_outer_joins(:personals).where(personals: {event_id: nil})

这将检索所有没有关联个人的事件。

3级以上的滑轨:

Event.joins('LEFT JOIN personals ON event.id = personals.event_id').where('personals.event_id IS NULL')