如何使用Sequel从其他表中获取数据

时间:2015-06-19 15:28:06

标签: ruby sinatra sequel

我使用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表中获取所有信息。

希望有意义,并且非常感谢任何帮助。

1 个答案:

答案 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}})