Rails 4中的Datagrid Gem返回PG:UndefinedColumn:ERROR:

时间:2014-07-06 05:09:48

标签: ruby-on-rails datagrid reporting

头上没有留下头发(我有很多:)),我一直在拔头发,为了我的生活,我无法解决这个问题。

我有两个表之间的一对多关系。我已经安装了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...

2 个答案:

答案 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)