【问题标题】:how to prevent jbuilder (rails) from calling database如何防止jbuilder(rails)调用数据库
【发布时间】:2017-06-12 12:54:28
【问题描述】:

我遇到了一个涉及控制器和jbuilder 视图的情况。控制器抓取一堆记录并更新它们。该视图使用 jbuilder 以 JSON 格式呈现更新的书籍。

app/controllers/books_controller.rb

def change_book_attributes
    @books = Book.where(...)
    @books.update_all(...)
    #@books.reload
end

app/views/books/change_book_attributes.json.jbuilder

json.seats @books, :id, :title, :state

情况是,当我同时更新多本书时,我得到一个 SQL UPDATE 语句(如预期的那样)和多个 SQL SELECT 语句(出乎意料 - 每本书一个!),而我更喜欢只有一个 SELECT 语句(例如由@books.reload 发布的一个 - 我在上面评论了它,因为它目前毫无意义,因为 jbuilder 似乎为每本书发布了一个 SELECT 语句)。

如果我暂时删除 jbuilder 文件中的单行,则不会发出 SELECT - 这告诉我是 jbuilder 发出了这些 SELECT 语句(每本书一个)。

问题:如何强制 jbuilder 使用现有的@books(可能在控制器中更新为@books.reload)?

(如果我更改 100 本书,我不想要 100 个 SELECT 语句 - 我只想要一个。)

【问题讨论】:

  • 你有没有找到解决这个问题的方法。我们遇到了一个非常相似的问题。
  • 对不起,不......但我在发布这个问题后不久也停止了搜索; 1年零9个月过去了,也许你的运气会更好。

标签: ruby-on-rails json performance


【解决方案1】:

您可以尝试将json.seats @books, :id, :title, :state 更改为Json.extract! @books, :id, :title, :state,看看是否有同样的问题。

【讨论】:

  • 感谢您的帮助。我尝试了你的建议,有坏消息,也可能是好消息。坏消息是输出产生了错误ActionView::Template::Error (undefined method 'id' for #<Book::ActiveRecord_Relation:...。可能的好消息是,作为测试,我将控制器方法的最后几行更改为 @books.reload; @books = @books.first,以便为它提供一个可以在其中找到 id 的对象(而不是集合对象)...现在的问题是如何让 jbuilder 循环遍历 @books ActiveRecord_Relation 的每个成员?
  • 我也尝试过json.array!,尽管它可以循环遍历@books 的每个成员,但它仍然为每个成员调用数据库。怎样才能让它只使用它给定的东西而不是查找每一个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2016-08-01
  • 2019-03-24
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多