2011-01-27 7 views
2

親オブジェクトの存在を検証し、親オブジェクトの妥当性を検証するオブジェクトを作成したいと考えています。しかし、私はそれを親オブジェクトとは独立に作成したいと思います。どうすればよいか分かりません。バリデーションのbelongs_toバリデーションとvalidates_presenceバリデーションの両方を持つオブジェクトを作成する正しい方法は何ですか?

これは私のコードです:

class User 
    has_many :questions 
end 

class Question 
    belongs_to :user 
    validates_presence_of :user 
    validates_associated :user 
end 

私はこれを行うことができます知っている:

u = User.create 
q = u.questions.create 

が、私はこの

は何
u = User.create 
q = Question.create(:user_id => u.id) 

q.valid? 
=> false 

q.errors? 
=> <OrderedHash {:user=>["can't be blank"]}> 

を行う必要があります正しい方法これに対処するには?

私はこれが不必要に厄介なようだ

class User 
... 
    before(:save) do 
    self.user = User.find(self.user_id) 
    end 

end 

を使用する必要があります - より良い方法はありますか?

+1

Peterさん、Userオブジェクトが作成され、新しいQuestionオブジェクトによって参照される前に保存されているかどうか不思議です。また、なぜ新しいものを作るか?これは申請の要件ですか、簡略表記ですか? – Nuby

+0

Nuby、私はただ単に「作成」を省略形として使用しています。私はそれが参照される前に作成され保存されていると思います。 –

答えて

3

validates_presence_of :userではなく、質問モデルでvalidates_the_presence_of :user_idを使用してください。

私はそれが役に立ちそうです。

+0

私はuser_idの存在とユーザの正当性を確認できるようにカスタムバリデータを作成します。それはまだ私が何かを欠いているように感じるが、これは一緒に行くために便利だった –

0

フォームを使用してオブジェクトを作成しますか?あなたがしている場合は、私はビルドメソッドとaccepts_nested_attributesを使用することをお勧めします - これはあなたが同時に親オブジェクトと子オブジェクトの両方を作成することができます。これをしたいときはいつもRyan's postと言います。

+0

残念なことにフォーム作成用ではなく、実際はもっと複雑な質問(親依存関係を持つオブジェクト)です。私がこれを求めている理由は、それが私が持っている主な問題の最も単純なサブセットだということです。 –

関連する問題