0

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

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

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

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

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

但我收到错误“nil:NilClass 的未定义方法 `interests'”,我的语法或逻辑有问题吗?

4

3 回答 3

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)
于 2010-02-15T08:43:15.617 回答
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 查询。但能完成工作。

第二次尝试应该包含一些复杂的连接,但我越想越觉得你的问题有多模糊。更精确。

于 2010-02-15T20:43:22.823 回答
0

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

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

应该可以工作。

于 2010-02-15T21:11:37.883 回答