在以下情况下是否可以为多态模型创建范围?
我有一个名为Mutations的多态模型。
class Mutation < ApplicationRecord
belongs_to :mutationable, :polymorphic => true
end
Mutation属于TimeRegistration和SickRegistration两种模式。 TimeRegistration和SickRegistration(Mutationable)属于用户。
class SickRegistration < ApplicationRecord
belongs_to :user
has_many :mutations, as: :mutationable
end
class TimeRegistration < ApplicationRecord
belongs_to :user
has_many :mutations, as: :mutationable
end
我想为Mutation创建一个范围,我可以通过给定的用户名检索Mutations的集合。我已经在Mutation模型上有更多的范围,所以这个范围必须与其他使用的范围(用于过滤)连接。
突变模型上有这样的东西:
scope :with_name, -> (name) { joins(mutationable: :user).where('users.name = ?', name) }
这不会奏效。我还尝试在Mutation模型上创建一个委托,并在可变模型上创建一个具有多个连接的自定义SQL查询,但没有成功。我认为必须有一种(更简单的)方法,但我无法找到这个问题的任何好的例子或内容。
请帮忙。提前谢谢!
答案 0 :(得分:0)
Mutation.rb
belongs_to :sick_registation, ->{where(mutations: {mutationable_type: 'SickRegistation'})},
foreign_key: 'mutationable_id'
belongs_to :time_registation, ->{where(mutations: {mutationable_type: 'TimeRegistation'})},
foreign_key: 'mutationable_id'
scope :with_name, ->(name){
joins(sick_registation: :user).where(user:{name: name}) +
joins(time_registation: :user).where(user:{name: name})
}
Explanation: There is no direct relation between your polymorphic relation and user. So, I am joining the results of individual associated i.e sick and time.
答案 1 :(得分:-1)
尝试
scope :with_name, -> (name) { where(mutationable: User.where(name: name)) }
编辑。添加)
编辑2:
我对我错误的快速解决方案&#34;由于没有仔细阅读,但我看到问题已被编辑,现在更清楚了。
知道你想要实现的目标我建议采用不同的方法。 Mutable不应该硬编码查看特定的模型,因为它将限制多态关联提供的灵活性,并将打破Demeter的法则&#39;
要获取一组特定XXXRegistrations的突变,我会这样做:
一个。使用STI以便查询XXXRegistrations,扩展注册模型。添加范围以按用户过滤。
SickRegistration < Registration
湾查询用户注册然后获取突变
Registration.for_user(user).joins(:mutations)