0

Я использую Rails Composite Keys в первый раз, и хотя я прочитал документы, я до сих пор не уверен, как правильно настроить модели.Rails Composite Keys - Настройка моделей и ассоциаций

Деятельность может быть запланирована поставщиком. Мне нужна таблица соединений, которая отслеживает activity_id и provider_id как уникальный составной ключ, так что я могу связать его с чем-то другим (цены). Состав должен быть создан при создании нового расписания. Поставщик не обязательно сам владеет своей деятельностью непосредственно.

У меня есть это для моего составного ключа, поскольку это собственная модель. Это правильно?

class ScheduledActivity < ActiveRecord::Base 
    self.primary_keys = :provider_id, :activity_id 
    belongs_to :activity 
    belongs_to :provider 
    has_many :schedules, :foreign_key => [:provider_id, :activity_id] 
    has_many :prices, :foreign_key => [:provider_id, :activity_id] 
end 

Это для миграции БД:

class CreateJoinTableScheduledActivities < ActiveRecord::Migration 
    def change 
    create_join_table :providers, :activities, table_name: :scheduled_activities do |t| 
     t.index [:provider_id, :activity_id] 
    end 
    end 
end 

Как потом получить новые записи на соединительной таблице, как создается расписание? Я помещаю только belongs_to :scheduled_activity в эту модель - т. Е. Нет идентификаторов провайдера и активности в таблице расписания, и я пишу отдельный крючок для создания новых составных клавиш?

(Также - это правильный вариант использования для составных ключей в первую очередь ?!)

Заранее спасибо!

ответ

0

Ну, я не уверен, что это полностью отвечает на ваш вопрос, но если у вас есть составной уникальный ключ, вы можете сделать что-то вроде следующего.

В вашей миграции:

add_index :scheduled_activities, [:provider_id, :activity_id], unique: true 

В вашей присоединиться модели:

belongs_to :activity 
belongs_to :provider 

validates :activity, presence: true, uniqueness: { scope: :provider } 

Учитывая, что это больше, чем просто присоединиться к таблице, может быть, вам следует использовать идентификаторы для идентификации каждого ScheduledActivity, то вам может просто добавить эту ссылку к вашей модели/таблице расписания (Schedule belongs_to :schedule_activity - таблица расписаний будет иметь ссылку на schedule_activity с атрибутом schedule_activity_id вместо использования составного ключа). Это сделает вещи намного проще и эффективнее.