如何将Arel查询与ActiveRecord方法相关联?

问题描述 投票:0回答:1

我发现了Arel,并且对于如何回到我的RoR 5.2应用程序中默认使用的ActiveRecord对象有点困惑。

最初,我的业务规则索引数据集定义为:

@business_rules = BusinessRule.pgnd(current_playground_scope). 
search(params[:criteria]).order("hierarchy ASC").
paginate(page: params[:page], :per_page => paginate_lines)

现在,名称和描述列由Translations表提供,这使得查询更复杂一些。这就是Arel的用武之地:

names = Translation.arel_table.alias('tr_names')
descriptions = Translation.arel_table.alias('tr_descriptions')
rules = BusinessRule.arel_table
translated_rules = rules.
join(names, Arel::Nodes::OuterJoin).on(rules[:id].eq(names[:document_id]).and(names[:language].eq(user_language).and(names[:field_name].eq('name')))).
join(descriptions, Arel::Nodes::OuterJoin).on(rules[:id].eq(descriptions[:document_id]).and(descriptions[:language].eq(user_language).and(descriptions[:field_name].eq('description'))))

rules_extract = translated_rules.project(Arel.star)
sql = rules_extract.to_sql
@rules_index = ActiveRecord::Base.connection.execute(sql)

#suggestions for better organising Arel's tree are welcome

to_sql方法提供了令人满意的SQL查询,但execute方法的结果返回了一个PG :: Result类,我期待一个ActiveRecord_Relation。

阅读我发现了很多关于Arel的功能,但我仍然错过了在索引视图中将其重新投入工作的链接。

谢谢你的帮助!

ruby-on-rails activerecord arel
1个回答
0
投票

实际上,Arel为标准的ActiveRecord查询接口提供了大量查询。这允许我重写原始的Rails索引查询并添加别名链接表两次:

def index
  names = Translation.arel_table.alias('tr_names')
  descriptions = Translation.arel_table.alias('tr_descriptions')
  rules = BusinessRule.arel_table
  translated_rules = rules.
    join(names, Arel::Nodes::OuterJoin).on(rules[:id].eq(names[:document_id]).and(names[:language].eq(user_language).and(names[:field_name].eq('name')))).
    join(descriptions, Arel::Nodes::OuterJoin).on(rules[:id].eq(descriptions[:document_id]).and(descriptions[:language].eq(user_language).and(descriptions[:field_name].eq('description')))).
    join_sources

  @business_rules = BusinessRule.joins(translated_rules).order("hierarchy ASC, major_version, minor_version").paginate(page: params[:page], :per_page => paginate_lines)

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @business_rules }
  end
end

现在我已准备好对我的查询进行智能重构,并从Translations表中检索已翻译的字段!

© www.soinside.com 2019 - 2024. All rights reserved.