提问人:Hernan Acosta 提问时间:8/4/2023 最后编辑:dbuggerHernan Acosta 更新时间:8/8/2023 访问量:46
对 polimorphyc 关联进行排序
Sort on a polimorphyc association
问:
假设我有以下多态关系
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 排序。
答:
1赞
David
8/8/2023
#1
如果它是一个较小的数据集,并且你不希望更大的数据集,你可以简单地在 Ruby 中对它们进行排序。
否则,您可以在 和 表上添加数据库视图,并按该视图排序。例如,在 Postgres 中:companies
portfolios
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
评论
Arel::Nodes::NamedFunction.new('ISNULL',[Company.arel_table[:name],Portfolio.arel_table[:name]])
Array