Ruby 通过Sinatra获得续集关联

Ruby 通过Sinatra获得续集关联,ruby,sinatra,sequel,Ruby,Sinatra,Sequel,我试图从我的Sinatra REST API返回json格式的数据。我目前已经建立了很多关联,但是我很难从我的API中获得我想要的视图,尽管在Ruby中很容易获得它们 例如,从我的表格: DB.create_table?(:calendars) do primary_key :id end DB.create_table?(:schedules) do primary_key :id foreign_key :resource_id, :resources foreign

我试图从我的Sinatra REST API返回json格式的数据。我目前已经建立了很多关联,但是我很难从我的API中获得我想要的视图,尽管在Ruby中很容易获得它们

例如,从我的表格:

DB.create_table?(:calendars) do
  primary_key :id

end

DB.create_table?(:schedules) do
  primary_key :id

  foreign_key :resource_id,  :resources
  foreign_key :task_id, :tasks
  foreign_key :calendar_id,  :calendars
end
在Ruby中,我可以运行这样的块,并通过我的关联显示我需要的所有信息:

Calendar.each do |c|
  c.schedules.each do |s| 
    puts "RESOURCE ##{s.resource_id}"
    s.tasks.each do |t|
      p t
    end
    puts
  end
end
c.schedules
调用之所以有效,是因为我的
calendar
模型包含一对多:schedules关联

现在,我想知道这是如何转化为我的Sinatra API的。在我的简单的
GET
route中,我尝试了许多变体,试图获取与日历关联的日程表,并将其转换为JSON:

get '/calendars' do
    c = DB[:calendar].first
    c.schedules.to_json
    content_type :json
end
。。。但是我最终会遇到一个错误,比如{:id=>1}:Hash的
undefined方法'schedules'

所以看起来它在这里返回了一个散列,但我已经尝试了很多东西,还没有弄清楚我应该如何与我在西纳特拉的协会合作。我该怎么做


谢谢

第一个块有效而第二个块无效的原因是,在第一种情况下,您使用的是类
日历的Sequel模型实例,而在第二种情况下,您使用的是Sequel
数据集

迭代
Calendar.each do | c |
时,
c
变量将填充
Calendar
类Sequel模型对象的实例。此对象定义了关系方法(
一对多
),您可以查询
计划
,并在其上运行其他模型方法

但是,
c=DB[:calendar]。首先,
为您获取一个日历。此对象与模型实例不同,它返回一个标准Ruby哈希(或哈希数组)

您可以将第二个块更改为使用模型,它将得到您想要的结果:

get '/calendars' do
    c = Calendar.first # <=== CHANGE FROM DATASET TO MODEL
    c.schedules.to_json
    content_type :json
end
get'/calendars'do
c=日历。首先#