gpt4 book ai didi

ruby-on-rails - 根据其多态关联的属性对 Rails 模型进行排序

转载 作者:行者123 更新时间:2023-11-29 11:41:38 24 4
gpt4 key购买 nike

我想这是一个重复的问题,但我还没有找到它,所以我想我会问。我有一个 User 模型,通过多态关联具有不同类型的 Profile 模型。像这样的东西:

class User < ActiveRecord::Base
belongs_to :profile, polymorphic: true
end

class Profile < ActiveRecord::Base
has_one :user, as: :profile
end

class FacebookProfile < ActiveRecord::Base
has_one :user, as: :profile
end

我想对用户执行查询,返回按个人资料对象的名字排序的用户。在没有任何多态关系之前,我可以通过 :profile 上的 joins 开始来做到这一点,但我知道这不适用于多态性。

除了使用 sortsort_by 之外,还有更好的方法吗?

User.all.sort_by {|user| user.profile.first_name }

最佳答案

它可以用 SQL 实现。

SELECT users.*, COALESCE(profiles.first_name, facebook_profiles.first_name) AS c_first_name FROM users 
LEFT JOIN profiles ON users.profile_id=profiles.id AND users.profile_type="Profile"
LEFT JOIN facebook_profiles ON users.profile_id=facebook_profiles.id AND users.profile_type="FacebookProfile"
ORDER BY c_first_name ASC

您应该能够在 User 模型上使用此“手动”连接创建范围,因为您可以在两列上使用 COALESCE 来创建别名您可以对其进行排序。

尝试这样的事情

class User < ActiveRecord::Base
belongs_to :profile, polymorphic: true

scope :sort_by_first_name, -> { select("users.*", "COALESCE(profiles.first_name, facebook_profiles.first_name) AS c_first_name").joins("LEFT JOIN profiles ON users.profile_id=profiles.id AND users.profile_type='Profile'").joins("LEFT JOIN facebook_profiles ON users.profile_id=facebook_profiles.id AND users.profile_type='FacebookProfile'").order("c_first_name ASC") }
end

我自己还没有尝试过,但理论上应该可行。

关于ruby-on-rails - 根据其多态关联的属性对 Rails 模型进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24642928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com