2017-08-04 10 views
0

私はajax-datatables-rails gemを使用して、サーバ側で処理されたデータテーブルを生成しています。私のデータベースモデルは次のようになりAJAX Railsで空のアソシエーションを使用したデータフィルタリング

class StoreDatatable < AjaxDatatablesRails::Base 

    def view_columns 
    @view_columns ||= { 
     id: {source: "Store.id"}, 
     name: {source: "Store.name"}, 
     item_qty: {source: "Item.qty"}, 
     item_name: {source: "Item.name"}, 
    } 
    end 

    def data 
    records.map do |record| { 
     id: record.id, 
     name: record.name, 
     item_qty: record.item.try(:qty), 
     item_name: record.item.try(:name), 
    } 
    end 
    end 

    private 

    def get_raw_records 
    Store.includes(:item).all 
    end 

end 

:私のDataTableのルックスのため

def index 
    respond_to do |format| 
    format.html 
    format.json { render json: StoreDatatable.new(view_context) } 
    end 
end 

そして、私のコーヒースクリプト:

class Store < ApplicationRecord 
    has_one :item 
end 

class Item < ApplicationRecord 
    belongs_to: store 
end 

私のコントローラは、このようになります私のDataTableクラスには、次のようになりますこのように:

$('#store').dataTable 
    processing: true 
    serverSide: true 
    searching: true 
    lengthMenu: [10, 25, 50, 100] 
    ajax: $('#store').data('source') 
    columns: [ 
    {data: 'id'} 
    {data: 'name'} 
    {data: 'item_qty', 
    defaultContent: ""}, 
    {data: 'item_name', 
    defaultContent: ""}, 
    ] 
    deferRender: true 

テーブルをうまく表示できますが、テーブルの結果をフィルタリングしようとすると、空の関連付けが原因でエラーが発生しています。すべてStoresには必ずItemsが必要ですが、Itemsがあるかどうかにかかわらず、すべてStoresを表示できるようにする必要があります(の代わりにjoinsの代わりにget_raw_recordsメソッドを使用しています)。

私は結果をフィルタリングしようとしたとき、私はRailsの中で得るエラーは次のとおりです。

ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'item.qty' in 'where clause'

はどのようにして、空の関連を扱うデータテーブルのフィルタを持つことができますか?関連付けは検索可能である必要があります。

私はRails 5.1.2、Ruby 2.4.1を最新のDatatablesリリース(宝石を含む)で使用しています。

+1

私はこの宝石を使ったことはありませんでしたが、 '参照(:item)'を 'get_raw_records'に追加するとどうなりますか? 「SQLフラグメントの場合は、結合テーブルを強制的に参照するために参照を使用する必要があります(ガイドから)(http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-eager-loaded-associations) –

+0

ありがとう!それはトリックをしたようだ。 – Wes

答えて

1

includeswhere条件を使用しての話をするときthe rails guideによると:

をあなたはそれハッシュ通過したときにのみ機能します。このようなwhereを使用します。 SQL-断片について、あなたはあなたがこの作品を作るためにreferences(:item) to get_raw_records`を追加する必要があり、結合テーブル

を強制的にreferencesを使用する必要があります。

関連する問題