如何在Rails控制器中获取祖父母的专栏

时间:2019-06-13 15:52:39

标签: ruby-on-rails ruby

我有三个关联的表:A,B,C。以下是关系,

A属于B,B有很多A

B属于C,C有很多B


我想在我的A控制器中获取数据to_json。

我尝试了以下代码

class AController < ApplicationController

def get_data
    @a_datas = A.all
    events = []
    @a_datas.each do |a_data|
      events << {:id => a_data.id, :title => "#{a_data.B.try(:b_id)}" , :start => "#{a_data.start_date}",:end => "#{a_data.end_date}" }
    end
    render :text => events.to_json
  end

该代码可以通过

正确输出父母的ID。
"#{a_data.B.try(:B_id)}" 

虽然我想通过相同的方法获取祖父母的ID(C.id)

"#{a_data.B.C.try(:C_id)}"

我遇到了undefined method `C' for nil:NilClass错误

如何修改代码以获得祖父母的id值?

非常感谢您!

1 个答案:

答案 0 :(得分:0)

您所说的没有道理。您的错误消息undefined method `C' for nil:NilClass-告诉您a_data.B为nil,所以我不确定父ID a_data.B.try(:B_id)可能如何工作?

但是要回答您的问题,每个a_data都是A类的实例,并且您尝试在实例上调用父类(B)时需要的是家长协会。

假设您的关联与您所说的...

class A
  belongs_to :b
end

class B
  belongs_to :c
end

要访问A实例的祖父母,您可以

    @a_datas.each do |a_data|
      events << {:id => a_data.id, :title => "#{a_data.b.try(:c_id)}" , :start => "#{a_data.start_date}",:end => "#{a_data.end_date}" }
    end

或者,如果您确信a_data.b存在,那么可以

    @a_datas.each do |a_data|
      events << {:id => a_data.id, :title => "#{a_data.b.c.try(:id)}" , :start => "#{a_data.start_date}",:end => "#{a_data.end_date}" }
    end