查找具有所有关联记录的记录

Ant*_*nAL 3 activerecord ruby-on-rails find has-and-belongs-to-many

说,

我们有一个"人"和"喜欢"的模特.

"喜欢"是这个人喜欢的:"音乐","视频","运动","互联网","旅行"等.

"人"HABTM"收藏"和"最喜欢的"HABTM"人物"

我需要找一个人,其中列出了所有"收藏夹.例如,找一个喜欢"音乐","旅行"和"运动"的人.

如何使用ActiveRecord.find方法完成它?

mar*_*ark 5

@people = Person.find(:all, 
   :joins => :favourites,
   :select => "person.*, count(favourites) favourite_count", 
   :conditions => {:favourites => @array_of_favourites}, 
   :group => "persons.id having favourite_count = #{@array_of_favourites.count}")
Run Code Online (Sandbox Code Playgroud)

你需要这样的东西来找到所有喜欢的人,而不是任何喜欢的组合.这是基于这样的假设,即您拥有一组喜欢的对象,而不是字符串集合.

Rails 4兼容解决方案:

@people = Person.joins(:favourites)
  .where(favourites: { id: @array_of_favourites })
  .group("people.id")
  .having("count(favourites.id) = #{@array_of_favourites.count}")
Run Code Online (Sandbox Code Playgroud)