【问题标题】:Accessing has_many from scopes从作用域访问 has_many
【发布时间】:2014-12-12 06:36:31
【问题描述】:

我有以下型号:

class ServiceProvider < ActiveRecord::Base
    has_many :versions, class_name: "ServiceProviderVersion"
end
class ServiceProviderVersion < ActiveRecord::Base
  belongs_to :service_provider
  has_many :service_provider_roles, :through => :service_provider_to_role_maps
  scope :effective, -> { where("effective_date <= ?", Time.now).order('effective_date desc') }
end
class ServiceProviderToRoleMap < ActiveRecord::Base
  belongs_to :service_provider_version
  belongs_to :service_provider_role   
end
class ServiceProviderRole < ActiveRecord::Base
  validates :name, presence: true, uniqueness: true

  has_many :service_provider_versions, :through => :service_provider_to_role_maps
  has_many :service_provider_to_role_maps, :dependent => :destroy 
end

现在我正在尝试获取所有有效且属于特定角色的服务提供商。理想情况下,我想执行以下操作

ServiceProviderVersion.effective.by_role('Admin')

但是,由于ServiceProviderVersion.effective 返回的不仅仅是一条记录,我无法在 ServiceProviderVersion 上定义一个按角色过滤的范围。

有什么方法可以实现吗?我正在使用 Rails4

【问题讨论】:

    标签: ruby-on-rails ruby scope


    【解决方案1】:

    尝试类似:

    class ServiceProviderRole < ActiveRecord::Base
       scope :by_role, ->(name) { where(name: name) }
    
    class ServiceProviderVersion < ActiveRecord::Base
        scope :by_role, ->(name) { joins(:service_provider_roles).merge(ServiceProviderRole.by_role(name)) }
    

    然后你可以调用:

    ServiceProviderVersion.effective.by_role('Admin')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 2019-10-10
      • 2020-04-22
      • 2019-10-29
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多