【问题标题】:How to optimize and DRY scopes in Ruby on Rails 5.2?如何在 Ruby on Rails 5.2 中优化和干燥范围?
【发布时间】:2020-09-07 13:36:44
【问题描述】:

为了 DRY 我的应用程序,我在 application_record.rb 文件中定义了“可见”范围(我的所有表都存在):

scope :visible, -> { where "is_active" }

当我查询对象列表时,如果我需要确定数据范围,我会在控制器中编写以下代码:

def index
@values_lists = ValuesList.joins(requested_values_lists).visible.search(params[:criteria]).
  select(index_fields).order(order_by).paginate(page: params[:page], :per_page => paginate_lines)

实际上,这个 values_lists 表链接到 users 表(定义所有者)和 business_areas 表(定义父)。为了优化查询,我尝试使用 Arel 在同一个查询中检索 values_list、父级和所有者:

def values_lists
  ValuesList.arel_table
end

def values_lists_parent
  BusinessArea.arel_table.alias('parent')
end

def values_lists_owner
  User.arel_table.alias('owner')
end

def requested_values_lists
  values_lists.
  join(values_lists_parent).on(values_lists[:business_area_id].eq(values_lists_parent[:id])).
  join(values_lists_owner).on(values_lists[:owner_id].eq(values_lists_owner[:id])).
  join_sources
end

def index_fields
  [values_lists[:id], values_lists[:code], values_lists[:name], values_lists[:description], values_lists[:status_id], values_lists[:updated_by], values_lists[:updated_at], values_lists_parent[:code], values_lists_owner[:name]]
end

查询在没有范围的情况下工作正常,但在应用范围时,我收到一条消息,指出“列名不明确 is_active”。有没有办法解决这个问题?

非常感谢!

【问题讨论】:

  • { where "#{self.table_name}.is_active" } 工作吗?

标签: ruby-on-rails arel


【解决方案1】:

我通过让 Rails 做聪明的工作解决了这个问题:

application_record.rb

scope :visible, -> { where is_active: true }

自行解析表名!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    相关资源
    最近更新 更多