如何使用 ajax-datatables-rails 理解 Rails 中的包含
Posted
技术标签:
【中文标题】如何使用 ajax-datatables-rails 理解 Rails 中的包含【英文标题】:How to understand includes in Rails with ajax-datatables-rails 【发布时间】:2018-06-27 00:59:01 【问题描述】:我正在使用ajax-datatables-rails
并想在数据表文件中使用关联模型,我想使用include()
方法。然而,事情并没有那么简单。根据https://github.com/jbox-web/ajax-datatables-rails 的说法,他们的include()
示例非常复杂,远远超出了我想要做的。
例如,我有一个名为 Page
的模型和一个名为 Book
的模型,我只想使用 Pages.include(:book)
以便稍后在我的视图中调用 page.book
。
我如何使用他们的方案来实现这一点?以下是我尝试过的方法,但没有奏效:
# app/datatables/example_datatable.rb
# Allow the use of helpers in JSON response.
def_delegators :@view, :link_to, :book_path
def view_columns
# Declare strings in this format: ModelName.column_name
# or in aliased_join_table.column_name format
@view_columns ||=
# id: source: "User.id", cond: :eq,
# name: source: "User.name"
position: source: "Page.position",
book_name: source: "Page.book.book_name",
end
def data
records.map do |record|
# example:
# id: record.id,
# name: record.name
position: record.position,
book_name: link_to("#record.book.book_name", book_path(record), remote: true),
end
end
private
def get_raw_records
# insert query here
Page.includes(:book).references(:book).distinct
end
如果我只是将它留在Pages.includes(:book)
,那么当我尝试使用搜索/过滤文本框时,我的数据表仅会出现错误。否则,一切都显示得很好。
我得到的错误状态:
“where 子句”中的未知列“pages.book”
在他们的示例中,他们声明 references(:related_model)
在这里,但我不确定如何使用我简单的单一模型关联来调整它。
【问题讨论】:
“没用”是什么意思?你观察到了什么?错误信息是什么?您是如何看到的? 我通过控制台看到了错误。它仍然给了我指南所说的错误:'where子句'中的未知列'pages.book',好像它不知道如何访问书。我也会用我的其余代码来更新它。 那么,您可以尝试这样做吗:Page.includes(:book).references(:book).distinct.to_sql
和 Page.includes(:book).references(:book).to_sql
看看它说了什么?有时这会让缺失的东西一目了然……
据此:github.com/jbox-web/ajax-datatables-rails 看起来您可能需要将Book.name
放入您的@view_columns
而不是Page.book.name
并使用joins(:book)
而不是include/references
?
哇,@TarynEast 成功了。非常感谢!!!!!!
【参考方案1】:
根据ajax-datatables-rails README,您可能需要:
-
将
Book.name
放入您的@view_columns
而不是Page.book.name
使用joins(:book)
而不是include/references
【讨论】:
以上是关于如何使用 ajax-datatables-rails 理解 Rails 中的包含的主要内容,如果未能解决你的问题,请参考以下文章
在 Rails 应用程序中转换 Javascript 数据表以使用 Opal