对 polimorphyc 关联进行排序

Sort on a polimorphyc association

提问人:Hernan Acosta 提问时间:8/4/2023 最后编辑:dbuggerHernan Acosta 更新时间:8/8/2023 访问量:46

问:

假设我有以下多态关系

class Metric < ApplicationRecord
    belongs_to :metrizable, polymorphic: true
    belongs_to :company, class_name: 'Company', foreign_key: 'metrizable_id', optional: true
    belongs_to :portfolio, class_name: 'Portfolio', foreign_key: 'metrizable_id', optional: true

end
class Company < ApplicationRecord
    has_many :metrics, as: :metrizable, dependent: :destroy
end
class Portfolio < ApplicationRecord
    has_many :metrics, as: :metrizable, dependent: :destroy
end

现在,指标可以通过公司或投资组合进行计量。 在两个表(公司、投资组合)中,数据库中都有名称字段。

example:

@search = Metric.ransack(params[:q])
@search.sorts = ["company_name asc", "portfolio_name asc"]
@search.result.to_sql

我得到类似的东西

"SELECT \"metrics\".* FROM \"metrics\" LEFT OUTER JOIN \"company\" ON \"company\".\"id\" = \"metrics\".\"metrizable_id\" LEFT OUTER JOIN \"portfolios\" ON \"portfolios\".\"id\" = \"metrics\".\"metrizable_id\" ORDER BY \"company\".\"name\" ASC, \"portfolios\".\"name\" ASC, \"metrics\".\"name\" ASC"

即使我得到了所有的记录,它们也不是按 entity.name、实体(公司、投资组合)排序的,我希望它们都按独立于源表的 entity.name 排序。

SQL Ruby-on-Rails Ruby Ransack Arel

评论

0赞 engineersmnky 8/31/2023
似乎对你有用,但是洗劫魔法似乎不支持 arel 对象作为种类的成员。Arel::Nodes::NamedFunction.new('ISNULL',[Company.arel_table[:name],Portfolio.arel_table[:name]])Array

答:

1赞 David 8/8/2023 #1

如果它是一个较小的数据集,并且你不希望更大的数据集,你可以简单地在 Ruby 中对它们进行排序。

否则,您可以在 和 表上添加数据库视图,并按该视图排序。例如,在 Postgres 中:companiesportfolios

CREATE VIEW entities AS SELECT
  id,
  name,
  metrizable_id,
  'company' AS type
FROM
  companies
UNION
SELECT
  id,
  name,
  metrizable_id,
  'portfolio' AS type
FROM
  portfolios

实体模型:

class Entity < ApplicationRecord
  self.inheritance_column = nil

  has_many :metrics
end

指标模型:

class Metric < ApplicationRecord
  # ...
  belongs_to :entity, foreign_key: 'metrizable_id', optional: true
end

然后在查询中:

@search = Metric.ransack(params[:q])
@search.sorts = ["entity_name asc"]
@search.result.to_sql