头上没有留下头发(我有很多:)),我一直在拔头发,为了我的生活,我无法解决这个问题。
我有两个表之间的一对多关系。我已经安装了Datagrid Gem用于报告。我需要根据另一个模型从一个模型中获取报告。
请查看我的代码。
reports_grid.rb
class ReportsGrid
include Datagrid
scope do
Land.includes(:estate)
end
filter(:estate, :enum, :select => proc { Estate.group("title").select("title").map {|c| [c.title] }})
column(:id, :header => "Land ID")
column(:current_stage, :header => "Stage")
column(:price)
column(:status)
end
reports_controller.rb
class ReportsController < ApplicationController
def index
@grid = ReportsGrid.new(params[:reports_grid]) do |scope|
if params[:reports_grid].present?
if params[:reports_grid][:estate].present?
scope.joins(:estate).where("estates.title = ? ",params[:reports_grid][:estate]).page(params[:page])
**# when I get the @grid.assets here all good and return correct number of rows**
else
scope.page(params[:page])
end
else
scope.page(params[:page])
end
end
end
end
Land.rb
belongs_to :estate
estate.rb
has_many :lands
现在当我去/ reports并尝试运行过滤器时,我收到以下错误
PG::UndefinedColumn: ERROR: column lands.estate does not exist LINE 1: ..._id" WHERE (estates.title = 'Olive Gardens' ) AND "lands"."e... ^ : SELECT COUNT(*) FROM "lands" INNER JOIN "estates" ON "estates"."id" = "lands"."estate_id" WHERE (estates.title = 'Olive Gardens' ) AND "lands"."estate" = 'Olive Gardens'
为什么Gem在我在实例中定义时会尝试将"lands"."estate" = 'Olive Gardens'
添加到查询中。
如果您需要我添加任何内容,请告诉我。提前谢谢。
编辑:
这就是我在Filter中所做的工作: 我这样做了:
filter(:estate_id, :enum,
:select => lambda {Estate.all.map {|p| [p.title, p.id]}},
:multiple => false,
:include_blank => true
) do |value|
self.where(:lands => {:estate_id => value})
end
你是一个好方法吗?
我想在范围内我可以说Land.joins(:estate)
然后在查询中使用scope.all.map...
。
答案 0 :(得分:0)
Datagrid过滤器旨在过滤数据,但不是默认情况下。
如果您有理由estate
不应自行过滤数据,请添加:dummy => true
选项:
filter(:estate, :enum, :select => ..., :dummy => true)
但我会推荐它。这样做,你的头发会立即开始增长:
filter(:estate, :enum, :select => ...) do |scope, value|
scope.joins(:estate).where("estates.title = ? ", value)
end
从文档中可以看出很明显: https://github.com/bogdan/datagrid/wiki/Filters#filter-block
答案 1 :(得分:0)
尝试使用参考
Land.includes(:estate).references(:estates)