2010-07-08 63 views
0

我有一个名为Purchase的模型和一个名为TicketType的模型。购买可以有许多票据类型,而票据类型可以有许多购买。如何命名多对多关联? [ActiveRecord]

所以我

class Purchase < ActiveRecord::Base 
    has_many :purchases_ticket_types, :class_name => 'PurchaseTicketType' 
    has_many :ticket_types, :through => :purchases_ticket_types 
end 

class TicketType < ActiveRecord::Base 
    has_many :purchases_ticket_types, :class_name => 'PurchaseTicketType' 
    has_many :purchases, :through => :purchases_ticket_types 
end 

class PurchaseTicketType < ActiveRecord::Base 
    set_table_name "purchases_ticket_types" 
    belongs_to :purchase 
    belongs_to :ticket_type 
end 

我知道一个表名purchases_ticket_types打算尽快麻烦的ActiveRecord的未能从骆驼套管类名标识正确的表名。我结束了不得不调用set_table_name。

但最糟糕的是不得不这样做:

purchase = Purchase.find(1) 
purchase.purchases_ticket_types.each do |purchase_ticket_type| 
    puts 'join contains quantity: ' + purchase_ticket_type.quantity 
    puts 'ticket type name is: ' + purchase_ticket_type.ticket_type.name 
end 

显得多么冗长和重复的读取。一切正常,但看起来很难看。有没有更好的方式来命名多对多的关联以避免这种事情:purchase.purchases_ticket_types.first.ticket_type.name

谢谢!

回答

3

如何使用TicketSale作为联接型号名称(或简称Sale,如果你的应用程序不从门票销售二话不说):

class Purchase < ActiveRecord::Base 
    has_many :ticket_sales 
    has_many :ticket_types, :through => :ticket_sales 
end 

class TicketType < ActiveRecord::Base 
    has_many :ticket_sales 
    has_many :purchases, :through => :ticket_sales 
end 

class TicketSale < ActiveRecord::Base 
    belongs_to :purchase 
    belongs_to :ticket_type 
end 
+0

这是一个很好的答案 - 但我想我只想芯片因为has_and_belongs_to_many也可以用于这些类型的关系。这里是文档:http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association – sosborn 2010-07-08 23:12:46

+0

@sosborn我用'has_many,:通过',因为这就是原来的问题,大概是因为原始海报需要额外的连接模型的属性,'has_and_belongs_to_many'不支持。 – 2010-07-09 08:05:44