簡體   English   中英

ActiveRecord has_many通過鏈接過濾器

[英]ActiveRecord has_many through chained filter

我的項目中包含許多材料,並且我試圖建立一個范圍鏈來對其進行過濾:

相關的project1 塑料相關的project2

如果用戶單擊紙張,我希望顯示project1project2 如果在此第一個查詢用戶之后單擊“ 塑料”,我想使用新約束過濾第一個查詢結果。

換句話說,如果我選擇紙張塑料 ,則只希望顯示project2

我的模特:

項目模型

class Project < ApplicationRecord
    has_many :project_materials
    has_many :materials, through: :project_materials

    scope :with_materials, -> (materials) { includes(:materials).where(materials: {id: materials} ) }
end

材質型號:

class Material < ApplicationRecord
  has_many :project_materials
  has_many :projects, through: :project_materials
end

project_material模型:

class ProjectMaterial < ApplicationRecord
  belongs_to :project
  belongs_to :material
end

我在Rails控制台中嘗試了以下操作:

p1 = Project.first
p2 = Project.last
m1 = Material.first
m2 = Material.last

p1.materials << m1

p2.materials << m1
p2.materials << m2

f1 = Project.with_materials(m1)
# which return p1 and p2

f2 = f1.with_materials(m2)
# which return nothings because of the following query

'SQL (1.0ms)  SELECT "projects"."id" AS t0_r0, "projects"."name" AS t0_r1, "projects"."difficulty" AS t0_r2, "projects"."status" AS t0_r3, "projects"."duration" AS t0_r4, "projects"."uuid" AS t0_r5, "projects"."slug" AS t0_r6, "projects"."created_at" AS t0_r7, "projects"."updated_at" AS t0_r8, "projects"."project_type_id" AS t0_r9, "materials"."id" AS t1_r0, "materials"."name" AS t1_r1, "materials"."created_at" AS t1_r2, "materials"."updated_at" AS t1_r3 FROM "projects" LEFT OUTER JOIN "project_materials" ON "project_materials"."project_id" = "projects"."id" LEFT OUTER JOIN "materials" ON "materials"."id" = "project_materials"."material_id" WHERE "materials"."id" = 5'

先感謝您。

我有一個解決方案,也許不是最優雅,但至少可以正常工作。

def self.with_materials materials
  materials = [materials].flatten.compact

  sql = "SELECT project_id, count(material_id) FROM project_materials WHERE material_id IN (?) GROUP BY project_id HAVING count(material_id) > ?"
  ids = ProjectMaterial.find_by_sql [sql, (materials), (materials.count - 1)]
  ids.collect!{ |i| i.project_id }

  where( id: ids )
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM