2012-01-24 72 views
1

我有一個集合類稱爲MYSET:銷燬 「具有n,:東西,:通過=>資源」 協會的DataMapper

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 ==) 

這是類似的,只是在MyElement描述DataMapper has n through Resource DELETE (Remove from association) not working問題不指定與MYSET的關聯。但是,我認爲該帖子中的解決方案就是我正在使用的,並且看起來不起作用。

+0

事實上,使用「has n,:my_sets,:through => Resource」在MyElement中指定關聯沒有任何區別。 –

回答

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的一部分的部分並不完全正確。好像你正在試圖做的是從「my_elements」集合中刪除它,所以你應該找到它,然後從集合「刪除」它:

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

(破壞它也可能是部分你想要做什麼,你可以分開做)。

就摧毀它就像你正在做可實際工作(我不知道),但你可能不得不重新加載資源在您的測試,以查看更新的大小:

subject.reload 
subject.size.should == 0