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 に要素を追加したり、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 ==)

これは、 MyElement がMySet との関連付けを指定していないことを除いて、 DataMapper has n through Resource DELETE (関連付けからの削除)が機能しないで説明されている問題に似ています。ただし、その投稿の解決策は私が使用しているものであり、機能していないようです。

4

1 に答える 1

0

コレクションのドキュメントをご覧ください。

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 の 1 つを破壊する部分が正しくないということです。あなたがやろうとしているのは、「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 に答える