如果返回nil,则删除记录

时间:2014-05-01 10:38:51

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

我正在向facebook api发出请求并且一些回复是空的/无,我想知道如何删除这些以便当我将它们保存到我的模型时我没有任何零条目。

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

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

任何帮助表示赞赏

修改

在阅读delete_if文档之后,在冰人评论之后,认为这样可行,但它没有,虽然它似乎更接近我想要的

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">]

为什么所有其余内容都被删除,也许我访问密钥的语法不正确?

由于

2 个答案:

答案 0 :(得分:2)

由于#delete_if传递给第二个参数:键和值,请尝试以下用法:

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

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

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

答案 1 :(得分:0)

我添加这个,因为有人可以提供一种更有效的方式来做到这一点,可能在记录被写入模型之前。但我已经设法解决了,虽然我会说一个hacky

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

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

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

赞赏任何其他建议