在ActiveRecord中自动加入关系

时间:2014-11-14 16:43:31

标签: ruby-on-rails ruby rest

您好我已经为我的Rails应用程序创建了一个基本的REST控制器,我很难让我的ActiveRecord模型加入请求。

我的目标是完成这样的事情:

要求:GET /约会 响应:

[
    {
        "id":1,
        "customer_id":3,
        "customer":{
            "name":"John Doe"
        },
        "date":"2011-11-11T00:00:00.000Z",
        "created_at":null,
        "updated_at":null,
        "employee_id":1,
        "employee":{
            "name":"Jane Doe"
        }
    }
]

但我刚刚得到这个:

[
    {
        "id":1,
        "customer_id":3,
        "date":"2011-11-11T00:00:00.000Z",
        "created_at":null,
        "updated_at":null,
        "employee_id":1
    }
]

这是我的基本REST控制器:http://pastebin.com/gQqBNeCH 如果你愿意,你可以阅读整个内容,否则你只需阅读我关注的代码:

def index
  @objects = get_class().all

  @objects.each do |x|
    x.get_relations
  end

  render json: @objects
end

这是我的约会模式

class Appointment < ActiveRecord::Base

  belongs_to :customer
  belongs_to :employee

  attr_accessor :customer

  validates :customer_id, presence: true, :numericality => {
    :only_integer => true,
    :allow_blank => false,
    :greater_than => 0
    }

  validates :employee_id, :numericality => {
    :only_integer => true,
    :allow_blank => false,
    :greater_than => 0
    }

  validates :date, presence: true

  def get_relations
    @customer = Customer.find(self.customer_id)
  end

end

我原来的方法就是使用像这样的成员变量:

def get_relations
  @customer = Customer.find(self.customer_id)
end

然而,看起来ActiveRecord有一些与render一起运行的序列化器方法。有关如何将belongs_to关系附加到该对象的任何建议吗?

2 个答案:

答案 0 :(得分:2)

如果要更改AR将对象渲染为json的方式,可以覆盖模型中的as_json方法(http://apidock.com/rails/ActiveModel/Serializers/JSON/as_json)。但这意味着将演示文稿信息放在您的模型中,而我并不是它的忠实粉丝。

您还可以在to_json来电中加入关系:

render :json => @objects.to_json(:include => :relation)

但在您的情况下,当您构建api时,我会研究一些更高级的JSON格式选项,例如RABLJBuilder

答案 1 :(得分:0)

您必须明确地将其包含在您的json响应中

def index
  @objects = get_class().all
  render json: @objects.to_json(:include => [:employee, :company])
end