1

我对 Ruby 和 Rails 框架还很陌生。我的背景主要是 Java。无论如何,我面临着一个奇怪的情况。我的一个模型中有一个返回关联模型的方法。关联如下。A has_many Bs, B属于A(即一对多)

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)。生活很好。

图一:

<% 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

你错了,它不是 Array,它是一个ActiveRecord::Relation类。.to_a如果你真的需要它,你可以将它转换为一个数组。我已经检查过了,您可以使用 [] 运算符通过 index: 访问项目ModelA.where("created_at = created_at")[0].name,所以我认为问题出在其他地方,可能在您的情况下。

检查文档。但无论如何,你不应该使用这样的关系。使用has_manybelongs_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在尝试访问属性时使用模型上的方法,我能够在没有空指针异常的情况下检索值。

例子:

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

我不清楚为什么我需要使用该.try方法。我的意思是,我知道该方法的用途。这是检查 nil 值并允许页面呈现而不抛出异常的便捷方法。但很明显,我的模型不是空的,它有数据。那么为什么我只能通过.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 回答