【问题标题】:Delete a record if nil is returned如果返回 nil,则删除一条记录
【发布时间】:2014-06-17 20:02:30
【问题描述】:

我正在向 Facebook API 发出请求,但其中一些响应为空/nil,我想知道如何删除这些响应,以便在将它们保存到我的模型时没有任何 nil 条目。

def formatted_data
  for record in results['data'] do
    attrs = {
             message: record['message'],
             picture: record['picture'],
             link: record['link'],
             object_id: record['object_id'],
             description: record['description'],
             created_time: record['created_time']
            }

         attrs.delete_if { |x| x.nil? }

         Post.where(attrs).first_or_create! do |post|
          post.attributes = attrs
         end
end

如您所见,我正在尝试使用 delete_if 方法,但它不起作用。

这是我想删除的回复示例:

id: 45
message:
picture: 
link: 
object_id: 
large_image_url: 
description: 
created_time: 2014-04-12 11:38:02.000000000 Z
created_at: 2014-05-01 10:27:00.000000000 Z
updated_at: 2014-05-01 10:27:00.000000000 Z

这种记录对我没有好处,因为它没有消息,所以也许我可以让查询指定 if message.nil ?然后删除

编辑

一直在阅读 delete_if 文档并在 iceman 的评论之后,我认为这会起作用,但它不起作用,尽管它似乎更接近我想要的:

attrs = attrs.delete_if {|key, value| key = 'message', value = nil }

返回了大约 25 条记录,其中 5 条应该被删除,但是在运行上述之后,我得到一个结果留在模型中:

 [#<Post id: 81, message: nil, picture: nil, link: nil, object_id: nil, large_image_url: nil, description: nil, created_time: nil, created_at: "2014-05-01 11:22:40", updated_at: "2014-05-01 11:22:40">]

为什么其余的都被删除了,可能是我访问密钥的语法不正确?

【问题讨论】:

  • 所以你必须删除字段:``消息:图片:链接:object_id:large_image_url:描述:`?
  • 是,如果 message = nil 则删除整条记录

标签: ruby-on-rails ruby facebook-graph-api methods


【解决方案1】:

由于#delete_if 将两个参数传递到块中:键和值,请尝试以下用法:

attrs.delete_if { |k,v| v.nil? }

对于,您可以删除所有空行,即nil,并为空:

attrs.delete_if { |k,v| v.blank? }

【讨论】:

  • 这会检查所有的键/值吗?在我的情况下 created_time: 将始终返回一个值,或者是否检查是否为记录返回任何 nil 值,然后它将删除
  • 好的,所以尝试了你的建议,但仍然返回 nil 结果
  • @Richlewis 你能在帖子中添加p attrs 的输出吗?在delete_if 行之前插入。
  • 谢谢,但这仍然会给我留下记录,不是吗,因为在我的示例中 created_time 仍然填充,是的,为您获取输出
  • @Richlewis 我不知道为什么会填充 created_time,如果在 delete_if 之前和之后看不到转储 attrs,在创建之后看不到 @post
【解决方案2】:

我添加这个是因为有人可以提供一种更有效的方式来执行此操作,也许在记录被写入模型之前。但是我已经管理了一个解决方案,尽管我会说这是一个 hacky 的解决方案

我在创建帖子后添加了这个

delete_if_nil = Post.where(message: nil) 
delete_if_nil.destroy_all

我猜它对数据库的另一个查询并不理想

任何其他建议表示赞赏

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多