繁体   English   中英

在 Rails 中删除多条记录

[英]Deleting Multiple Records in Rails

我正在开发一个允许用户选择多个条目的应用程序。 一旦选择了这些条目,用户就可以选择将它们全部删除。 单击删除按钮时(在选择一个或多个条目后),会显示一个模式对话窗口,显示用户已通过确认按钮选择的条目。

目前,以上所有内容都是在客户端使用 jQuery 完成的。 我已经设法将其全部设置好,以便确认按钮(这是一个使用:method => :deletelink_to )具有/entries/12,13,16,17的 URL,其中数字表示用户选择的条目。 我也试过用/entries/[1,2,3,4]格式发送网址,但没有成功。 我有一种感觉,我没有发送一个真正的数组。

这是我的删除方法,当使用一个 id(即/entries/1 )时它工作得很好,并且希望继续使用一个 id:

def destroy
 @entry = current_user.entries.find(params[:id])
 @entry.destroy

 respond_to do |format|
  format.html { redirect_to(entries_url) }
  format.xml  { head :ok }
 end
end

当我发送多个 id 的(格式为1,2,3,4,5 )时,只有第一个条目被删除,而其余的则保持不变。 这是我的 webrick 日志在执行操作后的样子:

Processing EntriesController#destroy (for 127.0.0.1 at 2009-12-03 23:07:24) [DELETE]
  Parameters: {"action"=>"destroy", "_method"=>"delete", "id"=>"19,22", "controller"=>"entries"}
  User Load (0.3ms)   SELECT * FROM "users" WHERE ("users"."id" = '2') LIMIT 1
  User Update (0.3ms)   UPDATE "users" SET "updated_at" = '2009-12-04 04:07:24', "last_request_at" = '2009-12-04 04:07:24' WHERE "id" = 2
  Entry Load (0.2ms)   SELECT * FROM "entries" WHERE ("entries"."id" = 19 AND ("entries".user_id = 2)) 
  Tagging Load (0.4ms)   SELECT * FROM "taggings" WHERE ("taggings".taggable_id = 19 AND "taggings".taggable_type = 'Entry' AND (taggings.context = 'tags')) 
  Tag Load (0.2ms)   SELECT * FROM "tags" WHERE ("tags"."id" IN (22,23,24,29)) 
  Tagging Destroy (0.2ms)   DELETE FROM "taggings" WHERE "id" = 66
  Tagging Destroy (0.1ms)   DELETE FROM "taggings" WHERE "id" = 67
  Tagging Destroy (0.0ms)   DELETE FROM "taggings" WHERE "id" = 68
  Tagging Destroy (0.1ms)   DELETE FROM "taggings" WHERE "id" = 69
  Tagging Load (0.1ms)   SELECT * FROM "taggings" WHERE ("taggings".taggable_id = 19 AND "taggings".taggable_type = 'Entry') 
  Entry Destroy (0.1ms)   DELETE FROM "entries" WHERE "id" = 19
  Entry Load (0.5ms)   SELECT * FROM "entries" WHERE ("entries".user_id = 2) 
Redirected to http://localhost:3000/entries

如您所见,ID 已发送( "id"=>"19,22" )但仅加载了第一个条目。 之后,它的关联标签被删除(我使用的是acts_as_taggable_on插件)。 然后,第一个条目 ( id => 19 ) 被销毁,用户被重定向回条目列表页面。

应该做的是为每个传递的 id 重复该过程(向上重定向)。 我很困惑,因为RoRs 文档指出:

id - 可以是整数或整数数组。

我究竟做错了什么? 我觉得我很近,我可以品尝它! 让所有 jQuery 工作对我来说是一个巨大的胜利,所以现在我知道处理多个 id 的控制器方法中唯一缺少的部分。

有一个 ActiveRecord 方法可以完全按照您的要求执行操作——请查看destroy_all 它需要一个字符串、数组或要删除的 id 散列。

我经常为destroy_multiple的控制器添加另一个操作——不要忘记添加收集路由:

def destroy_multiple
  current_user.entries.destroy_all(:id => params[:user_ids])
  redirect_to entries_url
end

快速解决:

我个人会以不同的方式发送ids ,但我不想弄乱您的路由。 所以这会起作用,但我只解决destroy部分:

current_user.entries.destroy(params[:id].split(','))

这使其作用域保持在current_user范围内,但直接使用 id 数组调用destroy函数。

更好的方法:

我如何建议让它更明显是这样的:

而不是/entries/12,13,16,17我会使用/entries/multiple?del[]=12&del[]=13&del[]=16&del[]=17

我知道那更长,但它更符合 rails 的自然工作方式。 然后在控制器上:

def destroy
   id = params[:id]
   id = (params[:del] || []) if(id == "multiple")

   current_user.entries.destroy(id)

   respond_to do |format|
     format.html { redirect_to(entries_url) }
     format.xml  { head :ok }
   end 
end

现在您的函数支持正常的单次destroy操作以及新的多次destroy

您是否尝试调试并检查 @entry 中返回的内容。 我想你可能没有得到整个数组。 您可以尝试使用 ruby​​-debug 插件来调试您的代码。 附带说明一下,使用 GET 删除可能不是最佳选择

您可以解析 params[:id] 并从中创建一个数组,然后使用它。

这是朋友帮我想出的:

def destroy
    params[:id].split(',').each do |id| 
        @entry = current_user.entries.find(id)
        @entry.destroy
    end

    respond_to do |format|
        format.html { redirect_to(entries_url) }
        format.xml  { head :ok }
    end
end

我相信这一切都可以做得更好、更有效,但对于 Alpha 来说,这会奏效。 感谢大家的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM