人を作成する際に1つ以上のグループを作成し、それらのグループが作成されたことを検証するオプションをユーザーに与える場合は、指定してください。それ以外の場合は、この回答の残りの部分はPersonを作成し、それが少なくとも1つの既存のグループに関連付けられていることを検証することに専念します。
groups_people結合テーブルでPerson-Groupの関連が存在することを確認する方法を尋ねる場合、これは奇妙なSQLクエリで行うことができ、お勧めできません。正常にテストされたActiveRecordが適切に動作することを信頼してください。
ただし、保存する前にPersonレコードに1つ以上のグループの存在を検証できます。
# 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
、およびコントローラが正しいです:あなたが参加するテーブルと呼ばれるgroups_peopleを移行したとして
限り
# 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 %>
の場合、個人レコードのグループの存在を確認できます。
class Person < ActiveRecord::Base
validates_presence_of :groups
has_and_belongs_to_many :groups
end
ありvalidates_associated helperですが、checkboxedオプションとしてGroup.allを示し、この場合、には必要ではないでしょう。
いいえ、これにはaccepts_nested_attributes_forが必要です。 Personを作成しているときにPerson用のGroupを作成していたとします。この場合も再度指定してください。
Group.allがオプションととして含まれている受信フォームを検証すると、その人と一緒にグループを作成するオプションが可能ですが複雑になります。これは、おそらく存在するグループモデル上の既存の検証をバイパスすることを含む。