2011-09-22 64 views
1

我有一个多租户Rails应用程序来创建支持票据。票据应该有增量票号。我无法使用ID列,因为由于该应用程序将被不同的帐户使用,所以他们会发现奇数票号。Rails应用程序不同账户的增量门票号码

例如,如果帐户1创建了两张票,他们得到门票#1和#门票2。帐户2创建一张票,他得到票#3。 (这很奇怪,因为他应该获得第一张门票,因为这是他在他的帐户下创建的第一张门票)。

所以,我应该在ticket表中添加一个ticket_number列。现在,你会如何自动增加数字并与其他账户分开?

回答

3
class Ticket 
    after_create :increment_tickets 

    def increment_ticket 
    Account.increment_counter(:ticket_number, self.account_id) 
    end 
end 
+0

的增量,我明白,但破坏可能不起作用后递减。如果你有门票1,2,3,并摧毁#2,那么,这将是困难的。 – mliebelt

+0

yeap,我没有想过的东西 – fl00r

2

的解决方案应该是你的客户表(你必须有一个,用于为多租户)应该由以下迁移扩展:

class AddCounter < ActiveRecord:Migration 
    def self.up 
    add_column :accounts, :ticket_counter, :integer 
    add_column :tickets, :ticket_number, :integer 
    end 
end 

每一次,你创建一个客户的门票,你必须增加门票号码。查看@ fl00r的帖子。票证的创建应该这样(代码从我的控制器):

class TicketController 
    def create 
    #Here comes your addition: 
    params[:ticket][:ticket_number]= Account.find(session[:account_id]).ticket_counter 
    # Here comes the rest 
    @article = Ticket.new(params[:ticket]) 
    ... 
    end 
end 

这里的背景是:

  • 你要知道这是当前账户(见session[:account_id],如果你有其他商店的当前帐户,使用它)。
  • 使用params[:ticket]散列中的ticket_counter创建票证。
  • 创建后,帐户中的计数器会增加(请参阅@ fl00r的答案)。
+0

那么我会从tickets_controller中获得这个值,然后增加它并使用它创建新的票据。如果故障单创建成功,则将增加后的值复制到ticket_counter。像那样的东西? – leonel

+0

将我的解决方案与来自@ fl00r的解决方案结合起来,这应该对你有用。你只需要实现'Account.increment_counter'方法,其余的都是通过rails完成的。 – mliebelt

+0

好吧,它会在帐户表中增加,但是如何将该值存入数字(表示票号)列中的票据表中?因为它在创建之后已经创建了票据。我需要再次打电话给机票并运行更新吗? – leonel

相关问题