2010-11-19 16 views
1

私は作成した多対多の関係について、新しい質問を持ち、子供から正しいデータを引き出します。Rails - 多対多の関係 - データの問題?

私が持っているものは、2つのモデル、1つは注文と別のステータスと呼ばれています。 CreateOrdersStatusesという名前の移行で2つのテーブルを結合しています。私は私の最初のオーダーステータスが割り当てられている

、およびコンソールが読み出さ次私に与えます::ルビーコンソールで

、私は例えば、親を経由して子の情報を引っ張って困難を抱えている

ruby-1.9.2-p0 > order.statuses 
=> [#<Status id: 1, name: "New", created_at: "2010-11-18 20:19:12", updated_at: "2010-11-18 20:19:12">] 

私の見解では、私は注文のステータスを表示しようとしていますので、私はコンソールのorder.statuses.nameで次のように試しています - 私は "新しい"。代わりに、私はこれを試みるときだけ "ステータス"を引き出すことができます。例:

ruby-1.9.2-p0 > order.statuses.name 
=> "Status" 

私の注文のステータス名を取得しようとすると、構文に関連すると思いますか?私はモデル/マイグレーションを必要に応じて提供することができます。私はnewbですから構文上の問題だと思っていました。

ありがとうございます。

+0

ただ、質問を想定し

order.statuses.first.name 

を: – DanneManne

答えて

0

order.statuses.nameは、order.statusesがコレクションであるため(最初の出力に角括弧が表示されるため)、「新規」を返しません。したがって、order.statuses.nameを実行することに意味がありません。たとえば、order.statuses[0].nameとすることができます。

しかし、order.statuses.nameのアソシエーションには、アソシエーションのクラスの名前を返すメソッドnameが実際に含まれているため、エラーは発生しません。あなたの場合、statusesクラスのクラスはStatusなので、このメソッドは "Status"を返します。あなたは確か多対している、あなたの注文のモデルということ

has_many :statuses 
+0

ありがとうニュートリノ。それは感謝している、私は本当にそれを感謝します。私は基本的に、私が作成したステータスコレクションのクラスの名前を教えてくれるように依頼していました。配列の最初のアイテムの「名前」を求めていませんでしたか?もう一度ありがとう、私は本当に感謝しています。 – Kombo

0

は、「[0]」、あなたが代わりに行うことができ不快配列インデックス表記を避けるために、この場合、多対多の関係は正しいですか?オーダーが同時に複数のステータスを持つことができる場合、たとえば、新着、進捗中、および同時に閉じることができ、それは私には当てはまらない。私はあなたがそれをbelongs_toアソシエーションに変更することを奨励します。ここで、注文はステータスに属し、ステータスはhas_manyオーダになります。
+0

has_and_belongs_to_manyに設定されていますので、これもうまくいきます。あなたが知っている場合、これに関連する簡単な質問:私は新しい注文を作成するとき、彼らは開始するステータスに関連付けられていません。それを設定する方法はありますか?注文を作成するとき、最初の関係が設定されていますか?私は幸運を設定していない:マイグレーションのデフォルト、おそらく私の注文モデルは状態にfkが含まれていないため。 – Kombo

+0

'initialize'という名前のメソッドをモデルに追加することができます。このメソッドは、既に設定されていない場合に関連するステータスを設定できます。 モデルのデフォルト値はRailsでは扱いにくいです。試したいかもしれない 'before_initialize'や 'after_initialize'のようなコールバックフックもあります。 – nessur