Ruby on Rails中多态模型的范围

时间:2017-10-11 14:36:08

标签: ruby-on-rails ruby model scope polymorphic-associations

在以下情况下是否可以为多态模型创建范围?

我有一个名为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查询,但没有成功。我认为必须有一种(更简单的)方法,但我无法找到这个问题的任何好的例子或内容。

请帮忙。提前谢谢!

2 个答案:

答案 0 :(得分:0)

******TRY THIS*****

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)