とに属しb.a must be exists
。これは、b.a_id
をゼロにすることはできません。または、a
を事前に作成する必要があることを意味します。使用して、我々は次のモデルがあるとし、レール5
すべては、belongs_to関連の解決策がoptional: true
であると言います。
しかし、アソシエーションが本当に厳格で、b.a
が決してnilにならない場合はどうなりますか?
良い解決策はoptional: true
を入れ、Bに検証ルールを追加しますか?
とに属しb.a must be exists
。これは、b.a_id
をゼロにすることはできません。または、a
を事前に作成する必要があることを意味します。使用して、我々は次のモデルがあるとし、レール5
すべては、belongs_to関連の解決策がoptional: true
であると言います。
しかし、アソシエーションが本当に厳格で、b.a
が決してnilにならない場合はどうなりますか?
良い解決策はoptional: true
を入れ、Bに検証ルールを追加しますか?
多くの場合、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'
に概説されたパターンに従うことをお勧めしますaccepts_nested_attributes_for')、baをnilにできないため、オブジェクトAを作成できません。問題はbelongs_toアソシエーションに 'optional:true'を追加せずにこのエラーを回避する方法です。 – rogelio
新しいAとBオブジェクトを' new'で作成し、 'a.save'を実行するとデータベースにすべてを保存する必要があると思います。 – HarlemSquirrel
ドキュメントによれば、それをする必要はありません。 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html新しいAオブジェクトを作成するためのパラメータがあることを確認してください – HarlemSquirrel