我有四个模型:Customer,QueueRed,QueueBlue,QueueGreen。
Queue模型与客户有一对多的关系
客户必须始终在队列中
客户一次只能在一个队列中
客户可以更改队列
我们必须能够找到客户在各自队列中的当前位置
在对象模型中,队列只有一个包含客户的数组属性,但ActiveRecord没有数组。
在数据库中,我可能会创建一些额外的表来处理队列中故事的顺序。
我的问题是在ActiveRecord中建模关系的最佳方法是什么?显然,有很多方法可以做到这一点,但最好或最符合ActiveRecord应该如何使用?
干杯,
克里斯
答案 0 :(得分:3)
我建议只创建两个模型:Customer和Queue。
队列表应包含:customer_id
,queue_type_id
,position
。
您也可以创建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,其中包含更多信息和一些解决方法。