3

我正在做类似于这些 railscast 剧集的事情:

http://railscasts.com/episodes/165-edit-multiple

http://railscasts.com/episodes/52-update-through-checkboxes

问题是那些只是试图修改选定的模型。我需要更新每个模型。

我发现的第一件事是它id not in ()并没有像我预期的那样返回所有东西,所以我不得不为空列表制作一个特殊情况。

这段代码有效,但看起来不是很干。至少我应该能够将正常情况合并为一行。

def update_published
  if params[:book_ids].empty?
    Book.update_all(published: false)
  else
    Book.where(id: params[:book_ids]).update_all(published: true)
    Book.where("id not in (?)", params[:book_ids]).update_all(published: false)
  end
  redirect_to books_path
end

任何改进的想法将不胜感激。

4

3 回答 3

2

为什么不直接执行以下操作:

def update_published
  Book.update_all(published: false)
  Book.where(id: params[:book_ids]).update_all(published: true)
  redirect_to books_path
end

它会更快,而且非常简单明了。

于 2013-01-15T06:35:14.580 回答
0

你可以这样做:

def update_published
    Book.transaction do
      Book.update_all(published: false)
      Book.scoped.find(params[:book_ids]).update_all(published: true) #Should be Lazyloaded. Testing Now
    end
end

因为它是一个事务,它会很快。另请注意我如何使用“查找”,而不是“在哪里”。在我看来它更好。使代码更简洁。

注意:我会质疑为什么您每次都需要更新每本书实体。一本一本地跟踪出版的书籍不是更聪明吗?如果您每次想要更新一本书时都需要传递每个书的 ID,那么您肯定会遇到麻烦。该解决方案的可扩展性不是很高。

你应该拥有的是:

def publish_book(book)
  book.published = true;
  book.save!
end

甚至更好:

#Book.rb
def publish
  self.published = true
  self.save #not 100% sure you need this. Anyone?
end

只要你可以(很多人同意)应该遵循“瘦控制器,胖模型”的方法。这意味着您基本上将尽可能多的代码放在模型类中,而不是在任何可以节省的地方。

于 2013-01-26T16:26:30.270 回答
0

我终于弄明白了。

def update_published
  Book.update_all(["published = id in (?)", params[:book_ids]])
  redirect_to books_path
end

昨天我试图做类似的事情,但它一直给我一个错误,?没有填写它并且它正在where对我的 id 进行操作。今天,我终于意识到我需要将两个参数包装到一个数组中。

一个奇怪的警告是它弄乱了我的一些规格。我正在检查错误,但它给出了零。在数据库中,它似乎设置为 false。我将我的规格从 更改be(false)be_false现在感觉很安全。

于 2013-01-15T15:52:50.977 回答