2015-05-13 70 views
1

我想用api中的數據填充我的數據庫表。我有參與,並建立了三個模型,如下圖所示:使用外部API請求數據填充rails數據庫

class Fixture < ActiveRecord::Base 

belongs_to :homeTeam, class_name: "Team", foreign_key: "homeTeam_id" 
belongs_to :awayTeam, class_name: "Team", foreign_key: "awayTeam_id" 
belongs_to :league 
validates :matchday, presence: true 
validate :opposing_teams_must_be_different 

#validates :externalFixtureID, :date, :matchday, :awayTeam, :homeTeam , :goalsHomeTeam, :goalsAwayTeam, presence: true 

def teams 
    [homeTeam, awayTeam] 
end 

    def opposing_teams_must_be_different 
    errors.add(:awayTeam, "must be different from Home team") if awayTeam_id == homeTeam_id 
    end 

class Team < ActiveRecord::Base 
    belongs_to :league 
    has_many :fixtures 
    end 

    class League < ActiveRecord::Base 
    has_many :teams 
    has_many :fixtures 
    end 

來填充數據庫,並確保我獲得了聯賽和球隊賽程,我用燈具模型下面的代碼:

def self.query_fixtures 
    uri = URI.parse("http://api.football-data.org") 
    http = Net::HTTP.new(uri.host, uri.port) 
    request = Net::HTTP::Get.new("/alpha/soccerseasons/354/fixtures") 
    response = http.request(request) 
    parsed_matches = JSON.parse(response.body)["fixtures"] 
    parsed_matches.each do |key, val| 

    @league = League.find(5) 
    @teams = @league.teams.each do |t| 
     if key["homeTeamName"] = t.name 
      homeTeam_id = t.id 
     elsif key["awayTeamName"] = t.name 
      awayTeam_id = t.id 
     end 
     @fixture = @league.fixtures.create!(:gameDate => key["date"], :matchday => key["matchday"], :awayTeam_id => awayTeam_id, 
              :homeTeam_id => homeTeam_id, :goalsHomeTeam => key["result"]["goalsHomeTeam"], 
              :goalsAwayTeam => key["result"]["goalsAwayTeam"]) 
     end 

     end 

    end 

但是,當我在rails控制檯中運行代碼時,數據庫會被填充,但awayTeam_id仍然爲空/空。我怎樣才能確保我已經填入awayTeam_id和homeTeam_id?團隊的名字和我從api得到的是一樣的。我設置了awayTeam_id和homeTeam_id基於homeTeamName = team.name和awayTeamName = team.name(請參閱query_fixtures方法中的循環)任何幫助,將不勝感激。

+0

不要採取這個人,但我投票結束這個問題,因爲雖然這是一個好問的問題,解決方案是非常特殊的問題,並不會廣泛適用於其他人。 – smathy

回答

0

if key["homeTeamName"] = t.name永遠是true因爲你使用賦值運算符(=),而不是布爾比較運算符(==),所以elsif永遠不會試圖(而且將永遠是正確出於同樣的原因) 。

0

您使用了錯誤的流量控制邏輯來填充這些領域,這一部分:

if key["homeTeamName"] = t.name 
    homeTeam_id = t.id 
elsif key["awayTeamName"] = t.name 
    awayTeam_id = t.id 
end 

使用=賦值運算符將的t.name值設置爲key["homeTeamName"],並truthy如果t.namenilfalse意味着只有homeTeam_id = t.id將永遠運行。

除此之外,即使你改變了操作者正確==平等運算符,if...elsif控制流將意味着只有兩種homeTeam_idawayTeam_id將設置,不可能兼顧。

每個@league.teams物體是什麼樣的? t.idhomeTeam_idawayTeam_id?有沒有t.away_team_id?在@league.teams.each區塊內添加一個puts t.inspect,然後發佈結果,我將通過更具體的幫助更新我的答案。

+0

感謝您的回答。這是它看起來像一個團隊,但包含更多:那麼如何根據homeTeamName和awayTeamName從API調用將值分配給homeTeam_id和awayTeam_id?請參閱我的協會。提前致謝 –