tva*_*nt2 3 postgresql ruby-on-rails polymorphic-associations active-record-query
我想这是一个重复的问题,但我还没有发现它,所以我想我会问.我有一个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
Run Code Online (Sandbox Code Playgroud)
我想在User上执行一个查询,返回按其个人资料对象的名字排序的用户.在没有任何多态关系之前,我可以通过以joinson 开头:profile,但我知道这不适用于多态.
除了使用sort或sort_by喜欢之外,还有更好的方法吗?
User.all.sort_by {|user| user.profile.first_name }
Run Code Online (Sandbox Code Playgroud)
它适用于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
Run Code Online (Sandbox Code Playgroud)
您应该能够在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
Run Code Online (Sandbox Code Playgroud)
我自己没有尝试过,但从理论上说它应该可行.
| 归档时间: |
|
| 查看次数: |
1293 次 |
| 最近记录: |