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]
  }]
)