如何 link Arel 使用 ActiveRecord 方法查询?
How to link Arel queries with ActiveRecord methods?
我正在探索 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)
现在,名称和描述列由翻译 table 提供,这使得查询有点复杂。这就是 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 查询,但是执行方法 returns 的结果是 PG::Result class 我期待的是ActiveRecord_Relation。
四处阅读,我发现了很多关于 Arel 功能的信息,但我仍然想念 link 在我的索引视图中将其重新投入使用。
感谢您的帮助!
实际上,Arel 为标准 ActiveRecord 查询接口提供了查询块。这允许我重写原始 Rails 索引查询并添加别名链接 table 两次:
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 table!
中检索已翻译的字段
我正在探索 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)
现在,名称和描述列由翻译 table 提供,这使得查询有点复杂。这就是 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 查询,但是执行方法 returns 的结果是 PG::Result class 我期待的是ActiveRecord_Relation。
四处阅读,我发现了很多关于 Arel 功能的信息,但我仍然想念 link 在我的索引视图中将其重新投入使用。
感谢您的帮助!
实际上,Arel 为标准 ActiveRecord 查询接口提供了查询块。这允许我重写原始 Rails 索引查询并添加别名链接 table 两次:
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 table!
中检索已翻译的字段