1

我有一个名为 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 has n through Resource DELETE (Remove from association) not working中描述的问题,除了 MyElement 没有指定与 MySet 的关联。但是,我认为那篇文章中的解决方案是我正在使用的,它似乎不起作用。

4

1 回答 1

0

查看 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
于 2012-06-05T21:18:03.817 回答