2010-07-08 92 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