Уничтожение ассоциаций "имеет, вещи,: через => ресурс" в DataMapper - PullRequest
1 голос
/ 24 января 2012

У меня есть класс коллекции 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 имеет n через Resource DELETE (Удалить из ассоциации), а неработает за исключением того, что MyElement не определяет связь с MySet.Тем не менее, я думаю, что решение в этом посте - то, что я использую, и это, кажется, не работает.

1 Ответ

0 голосов
/ 06 июня 2012

Взгляните на документацию Коллекции:

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
...