使用连接查询(许多m:n关系)

时间:2012-09-19 11:39:12

标签: sql ruby-on-rails database activerecord

我必须使用Rails的活动记录或sql(sqlite)执行以下查询。

让我们从模型的描述开始。

  • 用户1:n兴趣
  • 兴趣m:n类别
  • 兴趣m:n位置
  • 活动m:n类别
  • 活动m:n位置

m:通过具有模式interests_categories,events_categories等的第三个表,可以实现关系。

我有用户和那些用户有兴趣(类别 - >例如体育,音乐和他喜欢的位置)。事件被标记为位置和类别。

现在,我想列出可能适合特定事件的所有用户。例如,如果有一个事件发生在纽约市并且在体育运动中有一些东西,我想根据位置和类别得到可能对此事件感兴趣的用户列表。

我想在单个数据库访问中而不是多个访问。 在ActiveRecord或sql中会如何? (更有效的方式将是首选) 我可能必须首先加入类别/位置表,根据先前加入的所有表加入兴趣,然后根据兴趣选择所有用户。 不幸的是,我对连接sql的知识有限。或者甚至有不同的方法可供使用?

1 个答案:

答案 0 :(得分:1)

经过一番思考后,我觉得这次加入会有效。

class Events
  def get_users

User.joins(%"inner join interests on interests.user_id = users.id
             inner join categories_interests
               on categories_interests.interest_id = interests.id
             inner join categories on categories_interests.category_id = categories.id
             inner join interests_locations
               on interests_locations.interest_id = interests.id
             inner join locations on interests_locations.location_id = locations.id
             inner join categories_events on categories_events.category_id = categories.id
             inner join events_locations on events_locations.location_id = locations.id
             inner join events
               on categories_events.event_id = events.id
               and events_locations.event_id = events.id").where("events.id = :eid", :eid => id)

  end
end