Поддержание DataMapper заказанной ассоциации «многие ко многим»

У меня есть отношения DataMapper многие ко многим, друзья, которые нужно поддерживать в порядке. Как лучше поддерживать порядок? Я поместил свойство заказа в модель соединения, но не могу найти хороший способ его обновить.

Мой код:

class Person
  include DataMapper::Resource

  property :id,    Serial
  property :name , String, :required => true

  has n, :friendships, :child_key => [ :source_id ]
  has n, :friends, self, :through => :friendships, :via => :target
end

class Friendship
  include DataMapper::Resource

  property :source_id, Integer, :key => true, :min => 1
  property :target_id, Integer, :key => true, :min => 1

  property :order, Integer

  belongs_to :source, 'Person', :key => true
  belongs_to :target, 'Person', :key => true
end


a = Person.new
b = Person.new
c = Person.new

a.friends = [b, c] # Keep in this order

a.friends == [b, c] # This should be true
a.friends != [c, b]

a.save 

Спасение человека a должно создать дружбу между a и b со значением порядка = 1, а также вторую дружбу между a и c со значением порядка = 2.

У меня возникли проблемы с установкой значений заказа. Насколько я могу судить, дружба на самом деле не создается, пока a не будет сохранена, поэтому я не могу обновить их перед сохранением. И я не могу обновить их после сохранения, потому что заказ потерян.

Любые идеи?


person Kaom Te    schedule 24.12.2010    source источник


Ответы (1)


Вы можете сделать это:

Friendship.create(:source => a, :target=> b)
Friendship.create(:source => a, :target=> c)
a.reload
a.friends == [b,c]

Это должно дать вам желаемый эффект, предполагая, что столбец порядка в вашей базе данных автоматически увеличивается. Если это не так, вам нужно добавить что-то вроде этого в вашу модель дружбы:

before :create do
  self.order = Friendship.first(:order=>[:order.desc]).order + 1 rescue 0
end

Если вам небезразличен порядок этих дружеских отношений, вам также необходимо сделать это в модели Person:

has n, :friendships, :child_key => [ :source_id ], :order => [:order.asc]
person stef    schedule 28.12.2010