RubyOnRails 自定义 SQL Ransack 查询 gem 高级表单
RubyOnRails Custom SQL Query in Ransack gem Advanced Forms
Click on image to see view
Ransack 生成以下查询 SELECT "sheets".* FROM "sheets" WHERE ("sheets"."id" > 5)
但我想在查询中实现公式 SELECT "sheets".* FROM "sheets" WHERE (((score1 + score2)/2) > 5)
基本上我想比较公式而不是属性
是的,这可以使用 ActiveRecord 来完成。我更喜欢从参数中获取用户选择的值。
参数:
{ filters: [{column: "id", operator: ">", value: 5}] }
这样就可以在后台构造条件了
condition = ActiveRecord::Base.sanitize_sql('id > 5')
然后您可以将其传递给您的查询。
Sheet.where(condition)
为了实现这一点,您需要实施自定义 ransacker。
类似
class Sheet < ApplicationRecord
ransacker :average_score do |parent|
(parent.table[:score1] + parent.table[:score2]) / 2
end
end
然后你就可以使用通用的搜索语法了。例如average_score_gt
或使用更高级的版本(我相信)
Sheet.ransack(
conditions: [{
attributes: ['average_score'],
predicate_name: 'gt',
values: [5]
}]
)
Click on image to see view
Ransack 生成以下查询 SELECT "sheets".* FROM "sheets" WHERE ("sheets"."id" > 5)
但我想在查询中实现公式 SELECT "sheets".* FROM "sheets" WHERE (((score1 + score2)/2) > 5)
基本上我想比较公式而不是属性
是的,这可以使用 ActiveRecord 来完成。我更喜欢从参数中获取用户选择的值。
参数:
{ filters: [{column: "id", operator: ">", value: 5}] }
这样就可以在后台构造条件了
condition = ActiveRecord::Base.sanitize_sql('id > 5')
然后您可以将其传递给您的查询。
Sheet.where(condition)
为了实现这一点,您需要实施自定义 ransacker。
类似
class Sheet < ApplicationRecord
ransacker :average_score do |parent|
(parent.table[:score1] + parent.table[:score2]) / 2
end
end
然后你就可以使用通用的搜索语法了。例如average_score_gt
或使用更高级的版本(我相信)
Sheet.ransack(
conditions: [{
attributes: ['average_score'],
predicate_name: 'gt',
values: [5]
}]
)