销毁数据映射器中的"has n, :things, :through => Resource"关联



我有一个名为MySet:的集合类

class MySet
  include DataMapper::Resource
  property :id, Serial
  has n, :my_elements, :through => Resource
  def add integer
    unless my_elements.first(:integer => integer)
      my_element = MyElement.create :integer => integer
      my_elements << my_element
      my_elements.save
    end
    self
  end
  def has_integer? integer
    !my_elements.first(:integer => integer).nil?
  end
  def delete integer
    if has_integer? integer
      my_elements.first(:integer => integer).destroy
      my_elements.save
    end
    self
  end
  def size
    my_elements.size
  end
end

和一个名为MyElement的元素类:

class MyElement
  include DataMapper::Resource
  property :id, Serial
  property :integer, Integer
end

我希望能够在MySet中添加和删除元素。但是,以下规范:

describe MySet do
  subject do
    MySet.create
  end
  it "adds and deletes" do
    subject.add 1
    subject.delete 1
    subject.size.should == 0
  end
end

失败:

Failure/Error: subject.size.should == 0
expected: 0
got: 1 (using ==)

这类似于DataMapper中描述的问题,除了MyElement没有指定与MySet的关联之外,它通过资源DELETE(从关联中删除)没有工作。然而,我认为那篇帖子中的解决方案就是我正在使用的,它似乎不起作用。

查看Collection文档:

http://rubydoc.info/github/datamapper/dm-core/master/DataMapper/Collection

http://rubydoc.info/github/datamapper/dm-core/master/DataMapper/Associations/ManyToMany/Collection

我认为您正在做的一些事情是无关的,MyElement.create可能应该是MyElement.first_or_create,但更重要的是,您销毁MyElement之一的部分并不完全正确。看起来您要做的是将它从"my_elements"集合中删除,所以您应该找到它,然后从集合中"删除"它:

def delete integer
  element = my_elements.first(:integer => integer)
  my_elements.delete(element)
  self
end

(破坏它也可能是你想要做的事情的一部分,你可以单独做)。

像你所做的那样销毁它可能真的有效(我不确定),但你可能必须在测试中重新加载资源才能看到更新的大小:

subject.reload
subject.size.should == 0

最新更新