ruby-on-rails – 有没有办法重构将多态关联解压缩到其模型中?
发布时间:2020-12-17 02:23:21 所属栏目:百科 来源:网络整理
导读:例: 假设我们有一个具有多态关联的模型提醒. class Reminder ActiveRecord::Base belongs_to :rememberable,polymorphic: true scope :events,- { where(rememberable_type: 'Event') }end 然后,我可以获得所有记住事件的列表 events = Reminder.events.map
例:
假设我们有一个具有多态关联的模型提醒. class Reminder < ActiveRecord::Base belongs_to :rememberable,polymorphic: true scope :events,-> { where(rememberable_type: 'Event') } end 然后,我可以获得所有记住事件的列表 events = Reminder.events.map(&:rememberable) 题: 有没有办法将其放入多态关联的扩展或提醒范围?所以我们可以像这样调用它: events = Reminder.events.unpack 我尝试了什么: 我试过了 class Reminder < ActiveRecord::Base belongs_to :rememberable,polymorphic: true do def unpack map(&:rememberable) end end scope :events,-> { where(rememberable_type: 'Event') } end 和 class Reminder < ActiveRecord::Base belongs_to :rememberable,-> { where(rememberable_type: 'Event') } scope :unpack,-> { to_a.map(&:rememberable) } end 没有成功. 边注: 我知道,让一个范围结束ActiveRecord的Relation Proxy的可链接性是一般的坏习惯. 解决方法
除了破坏ActiveRecord关系链之外,您还将通过使用map和/或to_a来解决性能问题,这会强制获取所有现有记录并在Rails过程中循环遍历它们.
因此,您应该“查找至少包含一个相关提醒的事件”,而不是“查找现有提醒并向我提供相关事件”.事实上,在设计关联范围时,您应该始终从您希望在结果中使用的模型开始.不要尝试在Reminder中实现一个返回Event集合的范围. 1-让我们创造一个问题: module Rememberable extend ActiveSupport::Concern included do |base| base.scope :with_reminders,-> { joins :reminders } end end 2-包括您对模型的关注 class Event < ActiveRecord::Base include Rememberable ... 3-使用它 events = Event.with_reminders (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |