Использование ассоциации Has_and_belongs_to_many в рельсах с несколькими моделями - PullRequest
0 голосов
/ 04 сентября 2011

Я новичок в рельсах и у меня проблемы с представлениями, так что извините, если это простой вопрос. Мне было интересно, как добавить в представление has_and_belongs_to_many в представлении.

Вот ситуация у меня есть модель со следующими документами mongoid:

class Project
  include Mongoid::Document
  field :name, type: String
  key :name
  field :numPeople, type: Integer
  has_and_belongs_to_many :people
end

и ...

class Person
  include Mongoid::Document
  field :name, type: String
  key :name
  field :numProjects, type: Integer, default: 0
  has_and_belongs_to_many :projects
end

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

То, что я хочу, похоже на это (в HAML):

= form_for Project.new do |f|
    %p
        = f.text_field :name
        = f.submit "Add Project"

но я не хочу каждый раз создавать новый проект, поскольку проект может уже существовать.

Я просмотрел данные по formtastic и nested_form, но не увидел идеального примера, соответствующего моему сценарию.

Спасибо

1 Ответ

0 голосов
/ 04 сентября 2011

Я нуб, но я думаю, что могу помочь - не для части обзора, но для логики ниже.

Похоже, вам понадобится действие в вашем PersonPagesController, которое будет вызываться при отправке формы (при условии, что ваша форма отправляет имя человека и имя проекта), которое должно выглядеть следующим образом:

def add_person_to_project
  @person = Person.find(params[:person_name])
  @project = Project.find_or_create_by_name(params[:project_name])
  @project.persons << @person # or @person.projects << @project
end

информацию о find_or_create можно найти там http://api.rubyonrails.org/classes/ActiveRecord/Base.html (в разделе "Динамические искатели на основе атрибутов")

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

Кроме того, я бы вообще не советовал использовать поля имени в качестве ключей для ваших людей и проектов, но это ваше дело. Однако я бы посоветовал вам реализовать это по-другому, позволяя пользователю выбрать проект в списке или создать новый (что произойдет, если ваш пользователь, например, сделает опечатку?)

...