Подтвердить что ты не робот

Rails has_and_belongs_to_many & has_many: через строительные леса

Есть ли способ создать эшафот для моделей Rails, которые имеют либо has_and_belongs_to_many, либо has_many: через отношения? Если нет, есть ли причина развития, почему какая-то базовая форма этой функции не была включена? Rails требует от разработчиков генерировать и редактировать "настраиваемую" "миграцию таблицы соединений". Требуется ли пристальное внимание к тому, чтобы напоминать разработчикам Rails о каком-то важном факте или это просто пример того, как Rails - это "работа в процессе"?

Быстрый поиск в Stackoverflow для:

"has_and_belongs_to_many" yields 821 questions  
"has_many :through" yields 933 questions  

... и многие из них начинаются с "Как мне..." Таким образом, кажется, что тема не является тривиальной и актуальной для пользователей SO. Я думаю, мне интересно, почему он не получил внимания. Это вопрос сложнее, чем кажется? Набор функций для Rails выглядит настолько обширным. Я продолжаю задаваться вопросом, почему строительные леса для ассоциаций с таблицами объединений опущены.

Пожалуйста, сосредоточьте свой ответ на вышеприведенных утверждениях или включите оператор вроде: "Леса должны включать..." или "Создать рельсы script..."

Спасибо!

4b9b3361

Ответ 1

Мне нравится ваш вопрос, я задался вопросом, почему это не включено в Rails (и, как я подозреваю, недоступен как Gem). Вот некоторые из причин, почему это может быть проблемой. Я объясню их в типичном примере с помощью assemblies и parts.

  • Леса используются с помощью генераторов для создания файлов. Если вы перейдете на новую версию, иногда можно обновить существующие файлы, выполнив следующие шаги:

    • Скопируйте существующие в новое имя.
    • Перезаписать существующие новые.

    Это означает, что нет понятия добавления файлов или изменения файлов. EDIT. Это неверно, есть механизмы для добавления файлов и даже изменения в файлах.

  • Если вы посмотрите на генерацию, например, has_many :through (должно быть похоже на has_and_belongs_to_many), вы должны сделать следующее:

    • Добавьте миграцию, которая создает таблицу соединений.

      == > Должно быть возможно для строительных лесов: rails g scaffold_hmt Assembly Part

    • Добавьте модель для этой модели соединения.

      == > Должно быть возможно для строительных лесов предыдущим эшафотом.

    • Измените существующие модели на включение строк:

      assembly.rb: has_many 'assemblies_parts'; has_many :parts, :through => 'assemblies_parts'

      part.rb: has_many 'assemblies_parts'; has_many :assemblies, :through => 'assemblies_parts'

      == > Таким образом, никаких строительных лесов не возможно

    • Что делать с представлениями широко распахнуто. Есть примеры в RailsCast, как это сделать, но это совсем не тривиально, и нет ни одного единого метода, который бы хорошо работал при любых обстоятельствах. Я думаю, что различные шаблоны могут быть реализованы как шаблоны для строительных лесов (например, для использования флажков или списков с несколькими выборами или ввода текста с завершением). Однако проблема та же, что и в представлениях has_many.

Итак, как итог, эшафот может стоить попробовать (см. следующий параграф). RailsGuides для Создание и настройка генераторов и шаблонов Rails кажется правдоподобным. И решение, которое генерирует части файлов, называет их соответствующим образом и помогает в выводе леса на консоль, чтобы сделать все остальное вручную, может стоить попробовать.


Я попытался вчера придумать частичное решение, вы можете посмотреть его на GitHub. Он работает следующим образом:

  • Скопируйте содержимое каталога scaffold_hmt (означает has_many :through) в каталог приложений rails lib/generators.
  • Вы можете вызвать генератор с помощью rails g scaffold_hmt Assembly Part.
  • Затем он будет генерировать:
    • Миграция для таблицы соединений
    • Модель для таблицы соединений
  • Не удается изменить файлы:

    • Модель assembly.rb
    • Модель part.rb

    Причиной этого является то, что нахождение правильного места не является тривиальным. В качестве обходного пути он распечатывает то, что должно было вставляться в файлы.

    c:\apps\ruby\rails3\minds>rails generate scaffold_hmt Assembly Part
          create  db/migrate/20111011135944_create_assemblies_parts.rb
          create  app/models/assemblies_part.rb
    Try to insert into file: app/models/assembly.rb the following statements:
    
    has_many :assemblies_parts
    has_many :parts, :through => :assemblies_parts
          insert  app/models/assembly.rb
    Try to insert into file: app/models/part.rb the following statements:
    
    has_many :assemblies_parts
    has_many :assemblies, :through => :assemblies_parts
          insert  app/models/part.rb
    

Попробуйте и посмотрите, поможет ли это вам.