【发布时间】: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