【问题标题】:Remove object from array without deleting it from database从数组中删除对象而不从数据库中删除它
【发布时间】:2016-03-28 13:25:04
【问题描述】:

我遇到了一个问题,我只需要从 2 个活动记录对象数组中删除重复项。唯一的事情是它只是从数据库中删除它,在这种情况下我只需要从数组中删除它。我遵循了Remove object from an array of objects 并尝试了其他一些方法,他们能够将其从内存中删除并从数组而不是数据库中显式删除,但我无法复制它。任何建议都会很棒。谢谢大家!

company_links       = CompanyLinkType.where(company_id: company_ids, contact_linktype_id: 3)
other_company_links = CompanyLink.where(company_id: company_ids, link_type: 'Twitter')


company_links.each do |company_link|
  other_company_links.each do |other_company_link|
    # checks if id and url match, need to remove obj from company_link array
    if other_company_link.company_id == company_link.company_id && other_company_link.url == company_link.contact_link_url
      company_link.delete
      Rails.logger.info"+++++++++DELETED++++++++++"
    end
  end
end

【问题讨论】:

  • 如果两个数组具有相同类型的对象,您可以 OR 两个数组,例如:company_links || other_company_links,它将返回您需要的相同结果。

标签: ruby-on-rails arrays activerecord


【解决方案1】:

如果您不需要日志记录:

company_links = company_links.reject do |company_link|
    other_company_links.any? do |other_company_link|
        company_link.company_id == other_company_link.company_id && other_company_link.url == company_link.contact_link_url
    end
end

【讨论】:

  • 嘿,谢谢,不过我收到了这个错误。有任何想法吗? NoMethodError:#<:activerecord_relation:0x0000010b8e2d10> 的未定义方法“delete_if”
  • 啊,您需要使用reject,因为delete_if/reject! 仅在Array 上定义,而不是Enumerable。我已经更新了我的答案。
  • 这将返回一个数组而不是 ActiveRecord 集合
【解决方案2】:

company_link.delete 更改为company_links.delete(company_link)

【讨论】:

  • 嘿,谢谢,但它仍然会从数据库中删除条目。
猜你喜欢
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多