【问题标题】:Rails - Find results from two join tablesRails - 从两个连接表中查找结果
【发布时间】:2011-01-16 20:19:00
【问题描述】:

我有 3 个数据表和 2 个连接表。我正在想办法根据连接表数据相同的条件来查询结果。

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

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

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

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

但我得到了错误 "undefined method `interests' for nil:NilClass", 我的语法或逻辑有问题吗?

【问题讨论】:

  • 你能展示一下这个动作控制器的整个方法吗?

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


【解决方案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)

【讨论】:

  • 所以在控制器中调用它看起来像 "@Events = Event.shares_interest_with_user" ??
  • 命名范围很好用,非常感谢。我对最后一个条件有一个小问题,它不允许我使用 ["ui.user_id = ?",user],知道为什么它会抛出错误吗?
【解决方案2】:

给定Event &lt;-&gt; Interest &lt;-&gt; User查询用户兴趣与事件兴趣相匹配的所有事件(因此以下将查找该事件的兴趣也是至少一个用户的兴趣的所有此类事件)。

第一次尝试,最简单的方法:

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

非常低效,非常消耗资源和 CPU 密集型。生成大量的 sql 查询。但可以完成工作。

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

【讨论】:

    【解决方案3】:

    不确定我是否完全按照您的要求进行操作。如果您有一个用户,并且您想要该用户也感兴趣的所有事件,那么类似:

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

    应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多