2013-03-09 67 views
4

我試圖在我的Rails應用程序中使用模型來從外部API檢索信息。我想要做的是以類似於ActiveRecord模型提供的方式(特別是關聯,以及相同樣式的鏈式查詢方法)訪問我的數據模型(可能由多個API調用產生的信息組成)。在Ruby on Rails中對外部API支持的模型使用ActiveRecord接口

我最初的直覺是重新創建我想要的ActiveRecord的部分,併合並了這個API。不想「重新發明輪子」,看到要添加更多功能需要多少工作才能使我退後一步,重新評估如何解決這個問題。

我已經找到了使用ActiveRecord而不使用表格的方法(參見:Railscast#193 Tableless Model和博客文章here)並查看了ActiveRecord。由於ActiveModel似乎只包含驗證,我不確定這在這種情況下非常有用。在不使用表格的情況下使用ActiveRecord的解決方法似乎是最好的選擇,但我懷疑有一種更乾淨的方式來做到這一點,我只是沒有看到。

Here是一個包含了一些代碼,當我試圖重新創建ActiveRecord功能,從ActiveRecord源本身大量借用寫的代碼。

我的問題歸結爲:我可以通過執行上面指定的ActiveRecord的解決方法或自己重新創建功能來獲得我想要的功能(鏈接查詢方法,關係),但這些解決方案真的很理想嗎?

+0

查看https://github.com/adelevie/parse_resource中的代碼,它充當Parse.com API的包裝。也許它會有幫助。 – 2013-03-09 17:20:39

+0

我知道AR背後有不同數據庫的適配器,也許你可以寫一種「APIAdapter」? – 2013-03-09 17:27:34

+0

@RichardBrown - 謝謝。這真的會有所幫助。 – 2013-03-09 17:49:50

回答

1

請記住,Rails仍然只是Ruby下面。

您可以將外部API表示爲應用程序中的實例化類。

def Event 
    def self.find(id) 
    #...External http call to get some JSON...# 
    new(json_from_api) 
    end 

    def initialize(json) 
    #...set up your object here...# 
    end 


    def attendees 
    #...external http call to get some JSON and then assemble it 
    #...into an array of other objects 
    end 
end 

所以,你寫出來的本地抽象來創建API調用Ruby對象,你可能也和加載ActiveModel中,或者進入了Virtus它,這樣你就可以使用屬性的哈希值分配,並驗證表單等。

看看我爲TfL飼料管所做的API抽象。 service_disruption

+0

謝謝。當時,這幫助我意識到,我真正需要的只是抽象界面的一個好方法。 – 2015-08-27 02:47:15