2016-08-27 9 views
0

自分のビューで関連付けを使用するために必要なことを理解しようとしています。関連がhas_one関係の場合には何か問題があります。Rails - has_one関連がある場所でコンソールを検索する方法

私はProject and Packageというモデルを持っています。団体は以下のとおりです。コンソールで

Project has_one :package 

Package belongs_to :project 

、私は書くことができます:

p = Project.where(id: 26) 

私のプロジェクトを与えること。次に、私は書いています:

p.package 

私は関連するパッケージを与えることを期待しています。代わりに、次の行から始まる長いエラーメッセージが表示されます。

NoMethodError: undefined method `package' for #<Project::ActiveRecord_Relation:0x007fb275c17698> 

このメッセージの意味はわかりません。私は特に書くことができないので、私は書くことができます:

それは私に適切なパッケージを提供します。

p = Package.find_by(project_id:26) 
    Package Load (1.8ms) SELECT "packages".* FROM "packages" WHERE "packages"."project_id" = $1 LIMIT 1 [["project_id", 26]] 
=> #<Package id: 25, project_id: 26, created_at: "2016-08-18 23:16:06", updated_at: "2016-08-24 05:11:11", has_gallery: nil> 

p.packageをコンソールに書き込むと、パッケージが見つからないのはなぜですか?

私はthis postを見ましたが、何が起こっているのかを理解していません。

+0

に動作しますこれは、配列の最初の要素にpackageを呼び出しますあなたは外来のキーを呼び出し、どのテーブルに置いたのですか – Chris

+0

@Chris - どういう意味ですか?プロジェクトにはIDがあり、パッケージはプロジェクトに属しているので、パッケージテーブルにはproject_idキーがあります – Mel

答えて

0

whereは、関連オブジェクトの配列を返します(通常、has_manyの関連付けで使用されます)。関連付けられたオブジェクトが1つしかない場合でも、それは配列内で返されます。

find_byは、SQLクエリの最後にLIMIT 1を生成し、1つのインスタンスのみを返します。

配列にpackageを呼び出すことはできません。ActiveRecord_Relation配列には関連付けに関するアイデアがないため、配列には呼び出すことができません。 Projectのオブジェクトだけがメソッドpackageを知っています。このため、Project.where(id: something).packageは機能しませんが、Project.find_by(id: something).packageとなります。

あなたがpackageを呼び出したい場合はwhereを使用しているとき、あなたは(他の配列からのような)オブジェクトを選択する必要があります - Project.where(id: something).first.package - これはどうやっ

+0

ありがとうございます。それはパッケージを取得するために働いたが、私はして、パッケージテーブルの属性を参照したい:p.has_participants(has_participantsはパッケージテーブルの属性ですが、私は得る:p.has_participants NoMethodError:未定義メソッド ' has_participants for# これは、以前のp.packageがhas_participantsの答えとして「false」を含むレコードを私に渡しても、これはあります。それはどうやって理解できますか? – Mel

+0

@Melあなたのビューコードで質問を更新できますか?エラーから、 'Project'オブジェクトに対して' has_participants'を呼び出すのは明らかです。 – Kkulikovskis

+0

ああ - それはばかげていた。ありがとう – Mel

関連する問題