2017-02-13 3 views
2

とに属しb.a must be exists。これは、b.a_idをゼロにすることはできません。または、aを事前に作成する必要があることを意味します。使用して、我々は次のモデルがあるとし、レール5

すべては、belongs_to関連の解決策がoptional: trueであると言います。

しかし、アソシエーションが本当に厳格で、b.aが決してnilにならない場合はどうなりますか?

良い解決策はoptional: trueを入れ、Bに検証ルールを追加しますか?

答えて

0

多くの場合、belongs_toの関係を持つものがその列のセットを持っていることを検証する必要があります。

たとえば、ディスカッションに属する投稿がある場合、すべての投稿がディスカッションに属し、そのdiscussion_idが設定されている可能性があります。これを検証することは離れてその検証がかかりますRailsの5でbelongs_to :discussion, optional: trueを設定し、...しかし

class Post 
    belongs_to :discussion 
    validates :discussion_id, presence: true 
end 

我々はこのような何かを追加する必要がありましたレールレール4 5.

のデフォルトの動作です。私は、ディスカッションに関連付けられていない投稿が存在するようにしたい場合にのみこれを行います。

例のA has_many :bsの関係を厳密にしたい場合は、optional: trueを追加しないと、Rails 5がこれを検証します。

参考:あなたはすべてを一度Aと新しいBsを作成したい場合はhttp://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

が、その後、あなたが( `使用して、ネストされたフォームを使用している場合http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

params = { a: { 
    name: 'A new A!', bs_attributes: [ 
    { title: 'Something new b' }, 
    { title: 'Something else new b' } 
    ] 
}} 


class AsController < AC 
    def create 
    a = A.create(a_params) 
    end 

    ... 
    def a_params 
    params.require(:a).permit(:name, bs_attributes: [...]) 
    end 
end 


a.bs.length # => 2 
a.bs.first.title # => 'Something new b' 
a.bs.second.title # => 'Something else new b' 
+0

に概説されたパターンに従うことをお勧めしますaccepts_nested_attributes_for')、baをnilにできないため、オブジェクトAを作成できません。問題はbelongs_toアソシエーションに 'optional:true'を追加せずにこのエラーを回避する方法です。 – rogelio

+0

新しいAとBオブジェクトを' new'で作成し、 'a.save'を実行するとデータベースにすべてを保存する必要があると思います。 – HarlemSquirrel

+0

ドキュメントによれば、それをする必要はありません。 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html新しいAオブジェクトを作成するためのパラメータがあることを確認してください – HarlemSquirrel

関連する問題