Rails Rails 中的多对多自关联问题

longfei · 2017年06月20日 · 2336 次阅读

遇到了一个业务上的问题,虽然可以直接写 SQL 查询语句解决,不过 SQL 语句是相当相当的长。 所以还是想问问有没有更优雅的处理方式

问题描述:

模型类

  • 公司 Company:has_many 模板
  • 模板 CodeTemplate:模板类型值 source,has_many 模板项
  • 模板项 TemplateItem:代码 code,名字 name,标准代码 default_code。code 和 name 的格式会因模板类型值不同而变化。default_code 则不会。也就是说,在不同类型的模板中可能存在相同的 default_code。

表结构

省略了部分无关字段

create_table "companies", force: :cascade do |t|
  t.string   "name",                 limit: 255
  t.integer  "status",               limit: 4,   default: 0
end


create_table "code_templates", force: :cascade do |t|
  t.string   "name",       limit: 255
  t.integer  "status",     limit: 4
  t.integer  "source",     limit: 4
  t.integer  "company_id", limit: 4
end


create_table "template_items", force: :cascade do |t|
  t.string   "name",             limit: 255
  t.string   "code",             limit: 255
  t.integer  "status",           limit: 4
  t.integer  "code_template_id", limit: 4
  t.string   "default_code",     limit: 255
end

业务情景

现在要查看一个公司里的信息,有多个模板。其中固定会有一个默认模板,source 为 0,其它每个模板各自有不同的 source。 每个模板各自有一些模板项,其中有部分项有相同的 default_code。

希望查看 模板 1(source 为 2) 的模板项数据。同时,需要增加一列 default_name,显示默认模板中与 default_code 对应的 name,如果没有对应项,default_name 就取 nil。

更容易理解一点的说法: 把模板 1 和默认模板分别看成两张表, 问题就是如何取得模板 1 的数据,加上默认模板与模板 1,在 default_code 数据上有交集的部分。

因为数据较多,还要分页,所以我感觉没法先把数据全部取出来再做匹配。想问问看有什么好的处理方式。

SQL 语句:

SELECT u1.code u1_code,u1.name u1_name ,u1.default_code u1_default_code ,u2.name u2_name 
  FROM ( SELECT t0.code,t0.name,t0.default_code FROM template_items t0
    WHERE code_template_id IN (SELECT id FROM code_templates WHERE company_id = 1 AND source = 2 AND status=0)
  ) AS u1
  LEFT JOIN
  ( SELECT t1.code,t1.name,t1.default_code FROM template_items t1
     WHERE code_template_id IN ( SELECT id FROM code_templates WHERE company_id = 1 AND source = 0 AND status=0) 
  )  AS u2
  ON u1.default_code = u2.default_code limit 0,30;

部分查询结果

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号