has_and_belongs_to_many проверки - PullRequest
       0

has_and_belongs_to_many проверки

1 голос
/ 09 января 2012

Какой самый простой способ проверить, чтобы убедиться, что создание новой записи включает создание связанной записи через has_and_belongs_to_many?Например, у меня есть:

class Person < ActiveRecord::Base
  has_and_belongs_to_many :groups
end

class Group < ActiveRecord::Base
  has_and_belongs_to_many :people
end

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

Кроме того, как бы япостроить это в контроллере?Прямо сейчас у меня есть:

def create
  @person = current_user.people.new(params[:person])
end

Я бы хотел, чтобы params также включал групповой хеш, чтобы он служил своего рода вложенным ресурсом.

Я просмотрел документацию по Railsи я не смог ничего найти по этому конкретному делу.Если бы кто-то мог объяснить это мне или указать мне правильное направление, я был бы очень счастлив.Спасибо!

1 Ответ

3 голосов
/ 29 июня 2012

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

Если вы спрашиваете, как проверить наличие связи группы людей натаблицы присоединения к groups_people, это может быть сделано с помощью странных SQL-запросов и нецелесообразно.Просто верьте, что хорошо протестированный ActiveRecord работает правильно.

Однако вы можете проверить существование одной или нескольких групп в записи Person перед ее сохранением.

Пока вы мигрировали таблицу соединений под названием groups_people:

# db/migrate/xxxxxxxxxxxxxx_create_groups_people
class CreateGroupsPeople < ActiveRecord::Migration
  def change
    create_table :groups_people, :id => false do |t|
      t.string :group_id,  :null => false
      t.string :person_id, :null => false
    end
  end
end

# $ rake db:migrate

, и ваш контроллер верен:

# app/controllers/people_controller.rb
class PeopleController < ApplicationController
  def new
    @groups = Group.all
    @person = Person.new
  end

  def create
    @person= Person.new(params[:person])
    if @person.save
      # render/redirect_to and/or flash stuff
    else
      # render and/or flash stuff
    end
  end
end

, и у вас есть все существующие параметры группы в виде флажков:

# app/views/people/new.html.erb
<%= form_for @person do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
  # same for other person attributes

  <% @groups.each do |g| %>
    <%= check_box_tag 'person[group_ids][]', g.id, false, :id => g.group_name_attr %>
    <%= label_tag g.group_name_attr %>
  <% end %>

  <%= f.submit 'Create!' %>
<% end %>

, затем вы можете проверить наличиегрупп в вашей записи Person:

class Person < ActiveRecord::Base
  validates_presence_of :groups

  has_and_belongs_to_many :groups
end

Существует validates_associated helper , но в этом случае нет необходимости, когда вы указываете Group.all как флажки.

Для этого не требуется accept_nested_attributes_for.Это было бы, если бы вы создавали группу для человека при создании человека.Опять же, уточните, если это так.

Просто примечание: проверка входящей формы, включающей Group.all в качестве параметров и , дает возможность создать группу вместе с человеком, но это возможно, но сложно.Это будет включать обход существующих проверок модели группы, если таковые имеются, которые, вероятно, есть.

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