работа с полями выбора (RoR) - PullRequest
       0

работа с полями выбора (RoR)

0 голосов
/ 02 декабря 2009

Я создал приложение в Rails и сгенерировал две модели: одну для студентов и одну для наград.

rails students

script/generate scaffold student given_name:string middle_name:string family_name:string date_of_birth:date grade_point_average:decimal start_date:date

script/generate scaffold award name:string year:integer student_id:integer

У каждого ученика может быть много наград, поэтому я добавил has_many: награды к модели ученика. Я также добавил поле выбора в представление, которое позволяет пользователю создавать новые награды:

<%= f.select :student_id, Student.find(:all).collect {|s| [s.name, s.id]} %>

Мой вопрос: если бы я хотел предоставить пользователю возможность создавать вознаграждение без указания учащегося, как бы я изменил поле выбора, чтобы позволить ему это сделать?

Я новичок в Rails. Спасибо!

1 Ответ

1 голос
/ 02 декабря 2009

То, что вы описываете, является отношением многих ко многим. То, что вы сделали, это просто отношения один ко многим.

В отношениях «многие ко многим» вы определяете множество независимых записей на каждой стороне и используете таблицу соединений для создания ссылок между ними.

В отношении один ко многим каждая запись на одной стороне независима, в то время как каждая запись на стороне многих зависит от той, с которой она связана.

Примеры, вытекающие из ваших вопросов:

много ко многим: Каждый ученик может иметь много наград, но для того, чтобы он имел значение, его не нужно привязывать к награде. Каждая награда может быть заработана многими студентами, но для того, чтобы они имели смысл, не нужно связывать их со студентом Значки StackOverflow - прекрасный тому пример.

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

Как превратить ваши отношения в отношения многие ко многим:

  1. создать таблицу наград, в которой есть столбцы student_id и award_id.
  2. удалить столбец student_id из таблицы наград.
  3. Информировать ActiveRecord о связях.

    class Student < ActiveRecord::Base
      has_many :awardings
      has_many :awards, :through => :awardings
      ...
    end
    
    class Awarding < ActiveRecord::Base
      belongs_to :student
      belongs_to :award
    end
    
    class Award < ActiveRecord::Base
      has_many :awardings
      has_many :students, :through => :awardings
    end
    
  4. Обновите ваши формы, чтобы отразить изменения.

    Используйте либо поле множественного выбора, либо серию флажков, чтобы управлять несколькими одновременно. Есть много уроков об этом. Этот эпизод Railscast устарел, но это хорошее начало.

P.S. Скорее всего, вы получите ответы, если не отметите флажок вики сообщества. Вики сообщества предназначены для нетехнических вопросов, ответы на которые, вероятно, будут улучшены несколькими пользователями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...