【问题标题】:DataMapper delete works but only after restarting my appDataMapper delete 有效,但仅在重新启动我的应用程序后
【发布时间】:2011-01-23 03:40:20
【问题描述】:

我有两个模型,用户和片段:

class User
  include DataMapper::Resource

  property :id,Serial
  ...
  has n,:snippets
end

class Snippet
  include DataMapper::Resource

  property :id,Serial
  ...
  belongs_to :user
end

当我显示 sn-ps 时,我正在使用这个:

snippets = user.snippets

当我删除它们时,我正在使用这个:

snippet = Snippet.first(:user_id => user.id,:id => snip_id)
if snippet
    destruction_res = snippet.destroy
    ...
end

问题是,destroy_res 总是返回 true。删除 sn-p 后,我尝试保存用户。它也返回了 true。问题是,当我访问使用代码的视图时:

snippets = user.snippets

它返回完整的列表,包括应该被销毁的sn-p。但是,如果我重新启动应用程序,我会看到正确的列表。我究竟做错了什么?我应该以某种方式强制提交到数据库吗?

【问题讨论】:

    标签: ruby sinatra datamapper


    【解决方案1】:

    您可能在销毁 sn-p 之前加载了 sn-ps 集合,然后您再次访问该集合,它仍然包含已删除的 sn-p。如果是这种情况,您可以像这样拒绝已破坏的 sn-p:

    user.snippets.reject!(&:destroyed?)
    

    顺便说一句 - 你可以像这样销毁一个 sn-p:

    user.snippets.get(snip_id).destroy
    

    更好一点:)

    【讨论】:

    • 是的,我在内存中有这个集合,这就是静默错误。我重写了它,现在它工作正常,但是,我仍然希望这些对象“更好地绑定”到数据库。吸取教训,不要做假设:)
    猜你喜欢
    • 1970-01-01
    • 2020-03-23
    • 2011-05-15
    • 1970-01-01
    • 2017-06-27
    • 2014-09-14
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多