【问题标题】:Datamapper's hooks won't workDatamapper 的钩子不起作用
【发布时间】:2010-09-16 07:33:37
【问题描述】:

不明白为什么钩子不起作用。我有以下型号:

class DirItem
  include DataMapper::Resource

  # property <name>, <type>
  property :id, Serial
  property :dir_cat_id, Integer, :required => true
  property :title, String, :required => true
  property :price, Integer, :default => 0

  belongs_to :dir_cat
  has n, :dir_photos
  has n, :dir_field_values

  before :destroy do
    logger.debug "==============DESTROYING ITEM ##{id}, TITLE
#{title}"
    dir_field_values.destroy
    dir_photos.destroy
  end
end

当我从我的应用程序或 irb 调用 destroy 方法时,它会返回 falseerrors 哈希为空,不打印日志消息,也不会删除记录。

【问题讨论】:

  • destroy 覆盖解决了问题,但我很感兴趣为什么钩子不起作用。

标签: ruby hook datamapper


【解决方案1】:

这个钩子对我有用(ruby 1.9.2 / DM 1.0.2):

require 'rubygems'
require 'dm-core'
require 'dm-migrations'


# setup the logger
DataMapper::Logger.new($stdout, :debug)

# connect to the DB
DataMapper.setup(:default, 'sqlite3::memory:')

class DirItem
  include DataMapper::Resource

  # property <name>, <type>
  property :id, Serial
  property :dir_cat_id, Integer, :required => true
  property :title, String, :required => true
  property :price, Integer, :default => 0

  has n, :dir_photos

  before :destroy do
    dir_photos.destroy
  end
end

class DirPhoto
  include DataMapper::Resource
  property :id, Serial
  belongs_to :dir_item
end

DataMapper.finalize.auto_migrate!

@i = DirItem.create(:title => 'Title', :dir_cat_id => 1)
@i.dir_photos.create
@i.dir_photos.create
@i.dir_photos.create
@i.destroy

DM 记录器显示每个 dir_photos 在 dir_item 之前被销毁。不过,您可能希望考虑使用dm-constraints,而不是使用钩子。像这样的东西:

has n, :dir_photos, :constraint => :destroy

您可以确定,当 dir_item 被销毁时,所有 dir_photos 都将被销毁,这也将通过数据库级​​别的外键约束来强制执行。

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多