2011-01-27 23 views
0

我想写一个ActiveRecord的statment,我正在寻找的所有记录,其中ID不存在于另一个表中的记录...Rails的 - 寻找不存在的另一个连接表

请告诉我句法?

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

凡交友是一个连接具有USER_ID和事项标识表....

,所以我基本上是试图找到每一个事件的记录,该用户没有添加到自己的一套的个人记录....

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

+0

您是否遇到特定错误,或者只是好奇如果这是最有效的方法? – Nuby 2011-01-27 16:00:17

+0

如果关系如何设置,可以提供更好的答案。 – 2011-01-27 16:08:37

回答

6

我假设的关系如下:

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.events事件ID的用户“event_ids”。该查询来获取你想要做的应该是什么:

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”是模型名称的复数形式。

希望这会有所帮助...

+3

这不会生成两个SQL命令 - 一个收集? `@ user.event_ids`,还有一个`NOT IN [所有这些ID]`..这在许多情况下都很好,但是如果有数以万计的`@ user.event_ids`,那么生成纯SQL的东西是优选的;对? – 2016-02-10 12:04:35

7

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

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