[解決済み] Ruby on Railsです。Active Recordの.buildメソッドを:belongs toの関係で使用するにはどうすればよいですか?
質問
Railsの.buildメソッドに関するドキュメントを見つけることができませんでした(現在2.0.2を使っています)。
実験を通して、buildメソッドを使用してレコードを
has_many
リレーションにレコードを追加することができるようです。
例えば
class Dog < ActiveRecord::Base
has_many :tags
belongs_to :person
end
class Person < ActiveRecord::Base
has_many :dogs
end
# rails c
d = Dog.new
d.tags.build(:number => "123456")
d.save # => true
これで、犬もタグも外部キーできちんと保存されます。これは
belongs_to
の関係では動作しないようです。
d = Dog.new
d.person.build # => nil object on nil.build
また
d = Dog.new
d.person = Person.new
d.save # => true
の外部キーは
Dog
は、保存された時点ではまだ保存されていないため、新しい人物にidが設定されていないため、この場合は設定されません。
質問なのですが
-
Railsが正しい順序でレコードを保存する方法を見つけ出すのに十分賢いように、ビルドはどのように機能するのでしょうか?
-
どうすれば、同じことを
belongs_to
の関係で同じことができますか? -
このメソッドに関するドキュメントはどこにありますか?
ありがとうございます。
どのように解決するのですか?
どこに記載されていますか。
API ドキュメントの " の has_many の関連付けのところから。 モジュール ActiveRecord::Associations::ClassMethods "です。
collection.build(attributes = {}, ...) の1つまたは複数の新しいオブジェクトを返します。 コレクションタイプの インスタンス化され、属性が付与され このオブジェクトに外部キーでリンクされた このオブジェクトは、外部キーによってこのオブジェクトにリンクされていますが、まだ を返します。注意: これは、関連するオブジェクトがすでに存在する場合にのみ機能します。 関連するオブジェクトがすでに存在する場合にのみ動作します。 でない場合のみ動作します。
逆方向の構築の答えは、構文を少し変更したものです。あなたの犬との例では
Class Dog
has_many :tags
belongs_to :person
end
Class Person
has_many :dogs
end
d = Dog.new
d.build_person(:attributes => "go", :here => "like normal")
あるいは
t = Tag.new
t.build_dog(:name => "Rover", :breed => "Maltese")
create_dogを使用して、即座に保存することもできます(コレクションに対して呼び出すことができる対応する"create"メソッドと同様です)。
railsはどうして賢いのでしょうか?それは魔法です(正確には、私が知らないだけで、ぜひ知りたいです!)。
関連
-
[解決済み】gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] heroku push rejected, failed to compile Ruby/rails app
-
[解決済み] 該当するルートがない [GET] "demo/hello"
-
[解決済み] サーバーはRailsで既に稼働している
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Ruby on RailsでJSON出力を "きれい "にフォーマットする方法
-
[解決済み] Rails 4で懸念事項を使用する方法
-
[解決済み】Rails: #update_attributeと#update_attributesの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】修正方法:エラー:'<ファイル名>'にチェックアウトされたコミットがない fatal: コマンドプロンプトで "git add ." を入力するとファイルの追加に失敗する
-
[解決済み】gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み] Mac OS Xにhomebrewがインストールされているかどうかを確認する方法
-
[解決済み] Rails のインストールに失敗する: activesupport には Ruby のバージョン >= 2.2.2 が必要です。
-
[解決済み] 変更欄のRailsマイグレーション
-
[解決済み] rspec 3 - クラスメソッドをスタブ化する
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] Oauth2 Instagram API "リダイレクトURIが登録されたリダイレクトURIと一致しない"
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜ?
-
[解決済み] Ruby on rails アプリで ES6 (ES2015) を使用するにはどうすればよいですか?