Rails - 从两个连接表中查找结果

时间:2010-02-15 02:04:17

标签: ruby-on-rails find join conditional-statements

我有3个数据表和2个连接表连接所有内容。我试图找出一种方法来根据连接表数据相同的条件查询结果。

为了解释,我有用户,兴趣和事件表。这些表通过HABTM关系链接(这对我的需求很好,因为我不需要存储任何其他字段)并通过两个连接表连接。所以我还有一个带有(user_id,interest_id)的UsersInterests表和一个带有(event_id,interest_id)的EventsInterests表。

当尝试查询用户兴趣与事件兴趣匹配的所有事件时,问题就出现了。

我认为它看起来像这样......

 @events= Event.find(:all, :conditions => [@user.interests = @event.interests])

但是我得到了错误 “未定义的方法`兴趣'为nil:NilClass”,我的语法或逻辑是否有问题?

3 个答案:

答案 0 :(得分:1)

你的问题是@user或@event是未定义的。即使您定义它们,在执行此语句之前,提供的条件选项也无效,[@user.interests = @event.interests]

这个事件的命名范围应该起作用

class Event < ActiveRecord::Base
  ...
  named_scope :shares_interest_with_user, lambda {|user|
    { :joins => "LEFT JOIN events_interests ei ON ei.event_id = events.id " +
         "LEFT JOIN users_intersets ui ON ui.interest_id = ei.interest_id",
      :conditions => ["ui.user_id = ?", user], :group_by => "events.id"
    }
end

@events = Event.shares_interest_with_user(@user)

答案 1 :(得分:0)

鉴于Event <-> Interest <-> User查询用户兴趣与事件兴趣相匹配的所有事件(因此以下内容将查找此事件感兴趣的所有此类事件也是至少一个用户的兴趣)。

首先尝试,这是最简单的方法:

@events = []
Interest.all.each do |i|
  i.events.each do |e|
    @events << e if i.users.any?
  end
end
@events.uniq!

效率极低,资源非常耗力且cpu密集。生成大量的SQL查询。但是完成了工作。

第二次尝试应该包含一些复杂的连接,但我想的越多,我就越发现你的问题是多么模糊。更准确。

答案 2 :(得分:0)

不确定我是否完全遵循您的目标。如果您有一个用户,并且您想要该用户也感兴趣的所有事件,那么类似于:

Event.find(:all, :include => [:events_interests], :conditions => ['events_interests.interest_id in (?)', @user.interests.collect(&:id)])

应该可以工作。