私は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リリース(宝石を含む)で使用しています。
私はこの宝石を使ったことはありませんでしたが、 '参照(:item)'を 'get_raw_records'に追加するとどうなりますか? 「SQLフラグメントの場合は、結合テーブルを強制的に参照するために参照を使用する必要があります(ガイドから)(http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-eager-loaded-associations) –
ありがとう!それはトリックをしたようだ。 – Wes