2012-01-24 1 views
1

У меня есть коллекция класса под названием Инд.Сброс:Уничтожая "имеет п,: вещи,: через => Resource" ассоциаций в 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 

I хотите иметь возможность добавлять и удалять элементы на и из 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 не определяет ассоциацию с Инд.Сбросом. Тем не менее, я думаю, что решение в этом сообщении - это то, что я использую, и оно, похоже, не работает.

+0

На самом деле, указывая ассоциацию в MyElement, используя «имеет n,: my_sets,: through => Resource», не имеет никакого значения. –

ответ

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