Как назвать ассоциацию «многие ко многим»?[ActiveRecord] - PullRequest
0 голосов
/ 08 июля 2010

У меня есть модель с названием «Покупка» и модель с именем «TicketType».У покупки может быть много типов билетов, а у типа билетов может быть много покупок.

Итак, у меня есть

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

Я знал, что на приобретение закупок_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 ?

Спасибо!

1 Ответ

3 голосов
/ 08 июля 2010

Как насчет использования 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...