Поддержка DataMapper организовала ассоциацию «многие ко многим» - PullRequest
0 голосов
/ 24 декабря 2010

У меня есть 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 не будет сохранено, поэтому я не могу обновить их перед сохранением. И я не могу обновить их после сохранения, потому что заказ потерян.

Есть идеи?

1 Ответ

1 голос
/ 29 декабря 2010

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

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

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

has n, :friendships, :child_key => [ :source_id ], :order => [:order.asc]
...