2015-06-19 51 views
0

我用Sequel從其他表中的數據,我有以下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 

有一個在酒吧表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的結果,根據Bar表中的foo_id檢索?

甚至更​​多,如果有更長的關聯,比如說有另一個外鍵,例如baz_id,在鏈接到Baz表的Foo表中,並且在這個相同的API中,我也想獲得所有信息來自Foo和Baz表格,這些表格基於這些表格中的外鍵關聯。

希望有道理和任何幫助,非常感謝。

回答

1

您可以使用Sequel的to_json方法的:include選項來執行此操作。您可以在設置json_serializer選項時在模型中指定此選項,但是當您在實例上調用to_json時,還可以覆蓋這些默認值。

因此,在酒吧的單個實例,你可以這樣做:

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}}) 
+0

謝謝!這工作! –