通过Sinatra获得续集协会

时间:2017-09-17 19:59:49

标签: 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_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模型包含one_to_many :schedules关联。

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

get '/calendars' do
    c = DB[:calendar].first
    c.schedules.to_json
    content_type :json
end

...但我最终会遇到像undefined method 'schedules' for {:id=>1}:Hash

这样的错误

所以它看起来像是在这里返回一个哈希,但是我已经尝试了很多东西,并且没有弄清楚我应该如何使用我在Sinatra中的关联。我怎么能这样做?

谢谢!

1 个答案:

答案 0 :(得分:1)

你的第一个块工作但第二个块不工作的原因是因为在第一个案例中,你使用了类Calendar的续集模型实例,而在第二个案例中你正在使用续集 dataset

当您遍历Calendar.each do |c|时,c变量将填充Calendar类Sequel模型对象的实例。此对象具有已定义的关系方法(one_to_many),您可以查询schedules并在其上运行其他模型方法。

但是,c = DB[:calendar].first会为您提供Sequel dataset。该对象与模型实例不同,它返回标准的Ruby哈希(或哈希数组)。

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

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