【问题标题】:How to delete built resource?如何删除已构建的资源?
【发布时间】:2013-12-02 08:55:03
【问题描述】:
class Post < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :posts
end

我的问题是如何通过迭代删除构建的资源? 可以说我有许多 BUILT (尚未在数据库中)帖子的用户。 如何删除特定帖子? 我试过这种方法,但不行:

@user.posts.each {|post| post.delete if post.content.nil? }

当然是通过posts,执行'delete'方法,但是所有的posts都在开始的地方......

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    由于您正在处理未提交到数据库的built 对象,因此Post 对象上的常规方法destroydelete 将不起作用。您将不得不直接处理@user.posts 集合。

    我通常使用这种方法:

    @user.posts.each { |post| @user.posts.destroy(post) if post.content.nil? }
    

    在 Rails 控制台上运行良好。

    关于delete_alldestroy_all有条件

    这两种方法会派上用场,但它们是ActiveRecord::Relation 域的一部分。 @user.posts集合是关联而不是关系,所以它只暴露了delete_all方法,没有条件。

    如果你想使用它们,你应该尝试这样的事情:

     Post.delete_all(user_id: @user, content: nil)
    

    【讨论】:

    • 删除是一个有效的选项:stackoverflow.com/questions/4177686/…
    • 在您的控制台中尝试一下。 question = Question.new(title: 'blah'); question.destroy; question 看看你会发现什么。
    • 我已经使用经过 rails-console-tested 的解决方案更新了答案。
    • 我不知道 OP 的真正问题是什么。老实说,如果需要像这样解决问题,这看起来很糟糕:)
    • 这确实有效!但似乎这个解决方案需要很多“能量”,我错了吗?
    【解决方案2】:

    delete_all 与标准一起使用

    @user.posts.delete_all("content IS NULL")
    

    See here 了解更多信息。

    【讨论】:

      【解决方案3】:

      您可以使用reset 方法。它卸载关联。 Method API here

      这将删除所有未提交到数据库的built 对象:

      @user.posts.reset
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        • 2015-03-10
        • 2014-02-02
        • 1970-01-01
        • 2019-08-05
        相关资源
        最近更新 更多