我正在尝试从我的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中的关联。我怎么能这样做?
谢谢!
答案 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