我有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。
答案 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语法...