2012-01-09 8 views
1

新しいレコードの作成にhas_and_belongs_to_manyによる関連レコードの作成が含まれていることを確認する最も簡単な方法は何ですか?例えば、私がしている: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 

私は検証が、彼らは、少なくとも一つのグループに属していることを確認するために、新たな人の創造に発射したいです。

また、コントローラでこれをどのように構築するのですか?今すぐ私は持っています:

私はparamsにネストされたリソースの一種として働くために、グループハッシュも含めたいと思います。

私はRailsのドキュメントを調べましたが、この特定のケースでは何も見つかりませんでした。誰かがこれを私に説明したり、正しい方向に向けることができれば、とても幸せです。ありがとう!

答えて

3

人を作成する際に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がオプションとして含まれている受信フォームを検証すると、その人と一緒にグループを作成するオプションが可能ですが複雑になります。これは、おそらく存在するグループモデル上の既存の検証をバイパスすることを含む。