我使用Sequel
,我的Sinatra应用程序中有以下2个模型
# foo.rb
require 'sequel'
module Notes
module Models
class Foo < Sequel::Model
plugin :json_serializer, naked: true
plugin :validation_helpers
one_to_many :bars
def validate
super
validates_presence [:foo_name], message: "can't be empty"
end
end
end
end
# bar.rb
require 'sequel'
module Notes
module Models
class Bar < Sequel::Model
plugin :json_serializer, naked: true
plugin :validation_helpers
many_to_one :foo
def validate
super
validates_presence [:bar_name], message: "can't be empty"
end
end
end
end
Bar表中有一个foo_id
外键。
我有一个API路由,你可以获取所有条形或只是传入参数的特定条形,如下所示:
app.get '/api/bars' do
require_session
bar_name = params[:bar_name]
bar_model = Models::Bar
if bar_name.nil?
bar_model.all.to_json
else
bar_model.where(Sequel.ilike(:bar_name, '%' + bar_name + '%'))
.all
.to_json
end
end
我还想做什么,但尚未弄清楚我怎样才能从结果中的Foo表中获得至少foo_name
,并根据{{检索到1}}吧台中的那个?
更重要的是,如果还有更长的关联,比如Foo表中链接到Baz表的另一个外键,例如foo_id
,并且在此同样的API,我也希望根据这些相应表中的外键关联从Foo和Baz表中获取所有信息。
希望有意义,并且非常感谢任何帮助。
答案 0 :(得分:1)
您可以使用Sequel的to_json方法的:include
选项来执行此操作。您可以在设置json_serializer选项时在模型中指定它,但是当您在实例上调用to_json时也可以覆盖这些默认值。
因此,在Bar的单个实例上,您可以这样做:
Bar.first.to_json(include: {foo: {only: :foo_name}})
如果你想要一个完整的列表,就像在你的例子中,你想要在类上调用它。请注意,如果您在数组上调用它,这将无法正常工作,因此您必须在将数据集转换为数组之前在数据集上调用它。
# all models
Bar.to_json(include: {foo: {only: :foo_name}})
# a subset of models
Bar.where(Sequel.ilike(:bar_name, '%' + bar_name + '%'))
.to_json(include: {foo: {only: :foo_name}})