Rails:存储关系顺序的设计模式

时间:2010-05-12 14:50:53

标签: ruby-on-rails ruby activerecord

我有四个模型:Customer,QueueRed,QueueBlue,QueueGreen。

Queue模型与客户有一对多的关系

客户必须始终在队列中

客户一次只能在一个队列中

客户可以更改队列

我们必须能够找到客户在各自队列中的当前位置

在对象模型中,队列只有一个包含客户的数组属性,但ActiveRecord没有数组。

在数据库中,我可能会创建一些额外的表来处理队列中故事的顺序。

我的问题是在ActiveRecord中建模关系的最佳方法是什么?显然,有很多方法可以做到这一点,但最好或最符合ActiveRecord应该如何使用?

干杯,

克里斯

3 个答案:

答案 0 :(得分:3)

我建议只创建两个模型:Customer和Queue。

队列表应包含:customer_idqueue_type_idposition。 您也可以创建QueueType模型,但这不是必需的。

客户模式:

has_one :queue

队列模型:

belongs_to :customer

validates_uniqueness_of :customer_id
validates_uniqueness_of :position, :scope => :queue_type_id

named_scope :red, :conditions => {:queue_type_id => 0}
named_scope :green, :conditions => {:queue_type_id => 1}
named_scope :blue, :conditions => {:queue_type_id => 2}

我添加了命名范围来处理队列的颜色。

  

客户一次只能在一个队列中

队列模型中的第一次验证应该禁止客户在多个队列中。

  

客户可以更改队列

@customer = Customer.first
@customer.queue.queue_type_id = 1
@customer.save

在这里,你应该排队position,因为它必须在queue_type_id的范围内是唯一的。

  

我们必须能够找到客户在各自队列中的当前位置

customer.queue.position
  

在对象模型中,队列只有一个包含客户的数组属性,但ActiveRecord没有数组。

@queue = Queue.red

它返回客户数组。我不知道你的意思是“ActiveRecord没有数组”。

  

客户必须始终在队列中

嗯,只是:

@customer = Customer.new
@customer.build_queue

? 或者您可以添加一些before_save或更好的简单验证:

validate :ensure_customer_is_in_queue

def ensure_customer_is_in_queue
  errors.add_to_base "Customer should be in a queue!" unless self.queue
end

答案 1 :(得分:2)

您可能应该查看acts_as_list插件。

答案 2 :(得分:2)

这是对上面接受的答案的补充/补充。

acts_as_list不是为原型之外的任何东西设计的,开箱即用它根本不处理并发或数据完整性。至少,您必须将隔离级别设置为可序列化!这是一个short screen cast,其中包含更多信息和一些解决方法。