Как массово назначить, а затем редактировать индивидуально - PullRequest
2 голосов
/ 05 марта 2010

Справочная информация. У меня есть заявление со спортсменами, каждому из этих спортсменов (модель спортсмена) могут быть назначены тренировки (модель тренировки, workout_assignment через модель).

Проблема: Сначала я подумал, что использование сквозного соединения со спортсменами, имеющими много тренировок через workout_assignment, и тренировок, имеющих много спортсменов через workout_assignment, будет работать нормально для меня. Однако, если бы я сделал это таким образом, если бы я назначил тренировку 50 спортсменам, все они ссылались бы на одну и ту же запись тренировки. Я хочу, чтобы тренер (человек, который назначает тренировки) мог назначать одну и ту же тренировку 50 спортсменам, но затем иметь возможность менять их одну за другой, если он пожелает (настроить для спортсменов). Кто-нибудь есть совет для меня, как подойти к этому? Нужно ли создавать 50 копий тренировки и присваивать каждую из них пользователю? Нужно ли мне использовать workout_assignment через модель, если у меня есть отдельные тренировки?

Спасибо за любой совет, который вы можете дать!

Схема:

  create_table "athletes", :force => true do |t|
    t.string   "name"
    t.string   "username"
    t.string   "password"
    t.string   "sport"
    t.text     "notes"
    t.integer  "coach_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "crypted_password"
    t.string   "password_salt"
    t.string   "persistence_token"
  end

  create_table "coaches", :force => true do |t|
    t.string   "name"
    t.string   "username"
    t.string   "password"
    t.string   "address"
    t.string   "city"
    t.string   "state"
    t.string   "zipcode"
    t.string   "phone"
    t.string   "sports"
    t.integer  "experience"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "crypted_password"
    t.string   "password_salt"
    t.string   "persistence_token"
  end

create_table "workout_assignments", :force => true do |t|
    t.integer  "athlete_id"
    t.integer  "workout_id"
    t.date     "date_assigned"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "workouts", :force => true do |t|
    t.string   "name"
    t.string   "type"
    t.integer  "coach_id"
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "category_id"
  end

Модельные ассоциации:

class Athlete < ActiveRecord::Base
  belongs_to :coach
  has_many :workouts, :through => :workout_assignments
end

class Workout < ActiveRecord::Base
  has_many :athletes, :through => :workout_assignments
  belongs_to :category
end

class WorkoutAssignment < ActiveRecord::Base
  belongs_to :workout
  belongs_to :athlete
end

class Coach < ActiveRecord::Base
  has_many :athletes
  has_many :workouts
end

1 Ответ

2 голосов
/ 05 марта 2010

Причиной использования отношения «есть» и «принадлежит» (через взаимность: через отношение или иным образом) является повторное использование объектов с любой стороны.

Рассматривали ли вы использование модели расширенного соединения? Кажется, ваша модель workout_assignments уже соответствует столбцу date_assigned. Теория состоит в том, что ваша модель соединения включает в себя данные, специфичные для этого назначения. Таким образом, вам потребуется только одна копия каждого общего элемента тренировки и использовать модель назначений тренировки для хранения отдельных инструкций.

Вот как я бы предложил реализовать это:

Адаптируйте workout_assignments для включения специальных инструкций для спортсмена. Все, что вам нужно сделать, это добавить столбец в таблицу workout_assignments, я буду называть его special_instructions, но вы можете называть его как хотите.

В методе up новой миграции:

add_column :workout_assignments, :special_instructions, :string

Вот и все. Не обязательно отображать специальные инструкции в дополнение к описанию тренировки при отображении ее спортсмену / тренеру. Есть кое-что, что вы можете сделать, чтобы облегчить переход ссылки на workout_assignments вместо тренировок.

Посмотрите на делегирование, пользовательские средства доступа и использование опции: include в ассоциации has_many. Для вдохновения о том, как заставить эти модели работать лучше вместе. Идея состоит в том, что вы можете загружать связанные тренировки в любое время, когда загружаете назначение тренировки.

Делегирование - это метод, позволяющий передавать методы другим параметрам. По сути, создавая впечатление слияния двух моделей. В простейшем виде это выглядит примерно так:

def description
  workout.description
end

Затем напишите пользовательский метод доступа для описания в workout_assignments, который выбирает описание для связанной тренировки и отображает его вместе со специальными инструкциями назначения.

...