2016-01-04 114 views
0

我無法通過Postgres數據庫查詢創建Rails 4 ActiveRecord,該查詢通過has_many通過連接表由ID數組篩選。Rails ActiveRecord加入查詢

例如:

class Example < ActiveRecord::Base 
    has_many :available_options 
    has_many :options, through: :available_options 
end 

class AvailableOptions < ActiveRecord::Base 
    belongs_to :options 
    belongs_to :example 
end 

Example.joins(:options).where(item: true).where(options: {id: [1,2,3]}) 

這將返回具有1或2個或3個作爲選項的例子。我想返回具有所有選項的示例,並且只有所有選項。

有沒有辦法進行這樣的查詢?

感謝

回答

0

你應該做你的模型

class Example < ActiveRecord::Base 
    has_many :available_options 
    has_many :options, through: :available_options 
end 

class AvailableOption < ActiveRecord::Base 
    belongs_to :option 
    belongs_to :example 
end 

,且查詢下面應該是這樣的

Example.joins(:options) 
.where(item: true) 
.where(options: {id: [1,2,3]}) 
.having("count(options.id) = 3") 

爲了讓更多的動態

option_ids = [1, 2, 3] 
Example.joins(:options) 
.where(item: true) 
.where(options: {id: [1,2,3]}) 
.having("count(options.id) = #{options_ids.size}") 
+1

已經被用於過濾器組?缺少group_by語句? –

0
  1. 理想情況下,我們會發現AvailableOption(一個或多個),其具有所有ID [1,2,3]

    option_ids = [1, 2, 3]

    join_sql = AvailableOption.where(option_id: option_ids).group(:example_id).select(:example_id).having("COUNT(*) = ?", option_ids.size).to_sql

上面的SQL返回所有我們需要的example_id(s)

  1. 與實例加入到得到最終結果

    Example.joins("JOIN (#{join_sql}) AS TEMP ON id=TEMP.example_id").where(item: true)

-1

我想你可以試試這個:

option_ids = [1, 2, 3] 
Example.joins(:options) 
.where(item: true) 
.where(options: {id: option_ids}) 
.group(:id) 
.having("count(options.id) = #{options_ids.size}")