如何在第三个表上匹配两种记录

时间:2014-01-14 16:11:23

标签: mysql ruby-on-rails ruby-on-rails-3 activerecord

我有5张桌子:

**areas**
id
otherfields

**realtors**
id
otherfields

**users**
id
otherfields

**areas_realtors**
area_id
realtor_id

**areas_users**
area_id
user_id

我在模特中的关系是:

class Area < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_and_belongs_to_many :realtors
end

class AreasRealtor < ActiveRecord::Base
  belongs_to :realtor
  belongs_to :area
end

class AreasUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :area
end

class Realtor < ActiveRecord::Base
  has_and_belongs_to_many :areas
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :areas
end

在我的“房地产经纪人控制器”中,我需要选择与房地产经纪人有共同区域的所有用户。

我没有找到Active Record或“简单MySQL查询”的解决方案......

感谢您提前,

F。

3 个答案:

答案 0 :(得分:1)

这不是100%完成,但我认为它会让你走上正轨......

它消除了一些不必要的复杂性。基本上,房地产经纪人只是用户表中用户记录的扩展。

我会做这样的事情:

**areas**
id
otherfields

**users**
id
otherfields

**realtors**
id
user_id
otherfields

**user_areas**
area_id
user_id

我在模特中的关系是:

class Area < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class UserArea < ActiveRecord::Base
  has_many :user
  has_many :area
end

class Realtor < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :areas
  has_one :realtor
end

通过这种结构,它允许你做像

这样的事情

User.areas Realtor.user.areas或者如果您使用delegate,则可以执行Realtor.areas

然后最终得到你要求的东西,你可以Realtor.joins(:users).where(:area_id => 1)

答案 1 :(得分:1)

这应该为你做,...原因是“只是”红宝石解决方案,但工作。

@realtor.areas.collect(&:users).inject(&:+).uniq

collect方法返回一个数组,其中包含被调用方法users的返回值,该方法始终返回包含关联用户的数组。 inject方法在所有收集的数组上调用+方法,将它们添加到一个数组中。 uniq方法从数组中删除双用户对象。因此它返回一个数组,其中包含与@relator相关的区域相关的所有User对象。

答案 2 :(得分:0)

我在SQL查询中找到了答案:

select * from users where id IN (select distinct user_id from areas_users where area_id IN (select `area_id` from areas_realtors WHERE realtor_id='86'))

如果有可能我想使用activerecord语法...