维护DataMapper订购多对多关联

时间:2010-12-24 07:54:44

标签: ruby many-to-many associations 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 以及订单值= 2的 a c 之间的第二次友谊。

我在设置订单值时遇到了问题。据我所知,在保存 a 之前,友情实际上并未创建,所以在保存之前我无法更新它们。保存后我无法更新它们,因为订单丢失了。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你可以这样做:

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

假设数据库后端中的order列自动递增,这应该会产生所需的效果。如果没有,那么你需要在你的友谊模型中添加这样的东西:

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]