我正在尝试定义用户基于关联模型上的列访问某些内容的能力(类似于can :read, Step, 'steppable' => {published: true}
),问题在于它是多态关联,因此无法找到可执行的表因为它不存在。
我已经有了步骤,每一步都有一个步骤(讲座,测验或其他一些动作)。我需要一个有效的activerecord查询。我试过了:
Step.includes(:steppable).where('steppable' => {published: true})
和
Step.joins(:steppable).where('steppable' => {published: true})
但两者都会产生ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the polymorphic association :steppable
模型看起来像这样:
class Step < ActiveRecord::Base
...
belongs_to :steppable, polymorphic: true, dependent: :destroy
...
end
和
class Lecture
...
has_one :step, as: :steppable, dependent: :destroy
...
end
注意:我想对相关模型不可知,为了使其能够使用CanCan获取记录,必须使用数据库列来完成(参见{{3 }})
答案 0 :(得分:5)
你应该可以这样做:
can :read, Step, steppable_type: 'Lecture', steppable_id: Lecture.published.pluck(:id)
can :read, Step, steppable_type: 'OtherThing', steppable_id: OtherThing.published.pluck(:id)
您必须为每个Steppable
类执行此操作,但它会解决急切的加载多态关联问题。为了干这一点:
[Lecture, OtherThing].each do |klass|
can :read, Step, steppable_type: klass.to_s, steppable_id: klass.published.pluck(:id)
end
在这种情况下,只要每个steppable
类都有一个范围published
,您只需将任何steppable
类添加到该数组中,即使published
的定义不同在每个班级。
答案 1 :(得分:0)
你可以这样做:
lectures = Lecture.where(published: true)
steps = Step.where(steppable_type: 'Lecture', steppable_id: lectures)
或者,如果您真的想要对相关模型不可知:
Step.all.select { |s| s.steppable.published? }