1

私はRubyとRailsフレームワークにかなり慣れていません。私のバックグラウンドは主に Java です。とにかく、私は奇妙な状況に直面しています。モデルの 1 つに、関連付けられたモデルを返すメソッドがあります。協会は以下の通りです。A には複数の B があり、B は A に属します (つまり、1 対多)。

class ModelA < ActiveRecord::Base
  has_many :model_bs

  def get_bs
    ModelB.where(:a_id => id)
  end
end 

class ModelB < ActiveRecord::Base
  belongs_to :model_a
end

私の見解では、結果セット内のレコード (モデル) にアクセスしようとすると、問題なくそのプロパティを呼び出すことができます (図 A)。人生は素晴らしい。

図 A:

<% bs = a.get_bs %>
<% bs.each do |b| %> 
  <%= b.some_prop %> 
<% end %>

しかし、インデックスでモデルにアクセスしようとすると、nil オブジェクトではメソッドを呼び出すことができないというエラーが表示されます (図 B & C)。

図 B:

<% bs = a.get_bs %>
<%= bs[0].some_prop) %>

あるいは..

図 C:

<% bs = a.get_bs %>
<%= bs[0].first %>

動作しません。私はそれがユーザーエラーであることを知っています(私)。コレクションからオブジェクトにアクセスするためのドキュメントを見てきました (この場合、Ruby 配列だと思います)。ここで StackOverflow も検索しました。今でも頭を悩ませています。似たようなスレッドがなかなか見つかりません。

4

3 に答える 3

1

あなたは間違っています、それは配列ではなく、ActiveRecord::Relationクラスです。.to_a本当に必要な場合は、を使用して配列に変換できます。確認しましたが、[]演算子を使用してインデックスでアイテムにアクセスできます:ModelA.where("created_at = created_at")[0].name、問題は別の場所、おそらくあなたの状態にあると思います。

ドキュメントを確認してください。しかしとにかく、あなたはこのような関係を使うべきではありません。has_manyおよびを使用しbelongs_toて、モデル間の関係を示します。このような:

class ModelA < ActiveRecord::Base
  has_many :ModelB
end 

class ModelB < ActiveRecord::Base
  belongs_to :ModelA
end 
于 2012-07-07T18:37:14.603 に答える
1

解決策を見つけました。きれいではありませんが、今のところ期限が切れます。LinkedIn の誰かの助けを借りて.try、属性にアクセスしようとしているときにモデルでメソッドを使用すると、null ポインター例外なしで値を取得できることがわかりました。

例:

<% bs = a.get_bs.to_a%>
<%= bs[0].try(:some_attr) %>

.tryなぜこのメソッドを使用する必要があるのか​​ はわかりません。つまり、私はその方法が何であるかを知っています。これは、nil 値をチェックし、例外をスローせずにページをレンダリングできるようにするための便利なメソッドです。しかし、私のモデルが null ではなく、データがあることは明らかです。では、なぜ.tryメソッドでのみその属性にアクセスできるのでしょうか? 正直なところ、これは Rails のバグかもしれないと思います。

最終的には、メソッドを利用するヘルパー メソッドを作成することになると思います.try。そうすれば、私は.try自分の意見をすべて呼んでいるわけではありません。

于 2012-07-10T19:48:33.740 に答える
0

なぜこれを使用しないのですか?

def get_bs
  ModelB.find_all_by_a_id(id)
end
于 2013-06-25T20:01:19.850 に答える