首页 > 解决方案 > 基于其他模型创建动态范围

问题描述

在 Rails (5.0) 应用程序中,我有以下内容

class Batch < ApplicationRecord
  belongs_to :zone, optional: false
end

class Zone < ApplicationRecord
  scope :lines, -> { where(kind: 'line') }
end

现在我需要为每一条线定义Batch一个范围。Zone像下面的代码一样有效。

  Zone.lines.map(&:name).each do |name|
    scope "manufactured_on_#{name}".to_sym, -> { joins(:zone).where("zones.name = '#{name}'") }
  end

问题是上面的代码是在应用程序启动时评估的,那时范围是创建的。如果我添加一个新Zone的 kind line,则不会创建范围。

有没有办法解决这个问题?

标签: ruby-on-rails

解决方案


您可以将区域名称作为范围参数传递

scope :manufactured_on, -> (name) { joins(:zone).where(zones: { name: name } ) }

推荐阅读