0

本当に次の状況を回避しようとしています。私はスクリーンスクレイプを介してサッカーの結果を取得し、それらをモデル (結果) に保存しています。これまでのところ....モデル間にいくつかの関連付けが設定されており、関連付けられたモデルからすべての ID を取得して結果に保存したいと考えています。モデル..私のモデルはそのように設定されています

class Fixture < ActiveRecord::Base
  attr_accessible :away_team, :fixture_date, :home_team, :kickoff_time, :prediction_id
end

class Prediction < ActiveRecord::Base
  attr_accessible :away_score, :away_team, :fixture_id, :home_score, :home_team, :score

  has_one :fixture
  has_one :result
end

class Result < ActiveRecord::Base
  attr_accessible :away_score, :away_team, :fixture_date, :home_score, :home_team,  :prediction_id
end

私のスクリーンスクレイプはそのように見えます

def get_results 
 doc = Nokogiri::HTML(open(RESULTS_URL))
 days = doc.css('.table-header').each do |h2_tag|
  date = Date.parse(h2_tag.text.strip).to_date
   matches = h2_tag.xpath('following-sibling::*[1]').css('tr.report')
   matches.each do |match|
  home_team = match.css('.team-home').text.strip
  away_team = match.css('.team-away').text.strip
  score = match.css('.score').text.strip
  home_score, away_score = score.split("-").map(&:to_i)
  Result.create!(home_team: home_team, away_team: away_team, score: score, fixture_date: date, home_score: home_score, away_score: away_score)

  end
 end
end

したがって、結果を作成する前に、正しい結果 (サッカーの試合) に対応するフィクスチャ モデルから予測 ID を取得し、他のすべての属性を保存すると同時にそれらを保存する必要があります。 ..

ありがとう

編集

わかりましたので、ここまで来ました

fixture = Fixture.where(fixture_date: date, home_team: home_team, away_team: away_team).first
prediction_array = Prediction.where(fixture_id: fixture.id)

次に値を引き出す必要があります..

4

3 に答える 3

1

現在、フィクスチャ モデルには予測 ID があります。つまり、各フィクスチャには 1 つの予測しかありません。

また、いくつかの属性は冗長です。予測がフィクスチャを参照する場合、チームに関する独自の情報を保存する必要はありません。

結果モデルを削除し、他の 2 つのモデルを次のように変更することをお勧めします。

class Fixture < ActiveRecord::Base
  attr_accessible :away_team, :fixture_date, :home_team, :kickoff_time, :home_score, :away_score

  has_many :predictions
  has_many :correct_predictions, class_name: "Prediction", foreign_key: "fixture_id", conditions: proc{["home_score = #{self.home_score} AND away_score = #{self.away_score}"]}
end

class Prediction < ActiveRecord::Base
  attr_accessible :fixture_id, :home_score, :away_score

  belongs_to :fixture
end

結果エントリを作成する代わりに、フィクスチャを見つけてFixture.where(home_team: home_team, away_team: away_team, fixture_date: date)2 つのスコアを設定するだけです。

correct_predictionsは条件との関連付けであるため、フィクスチャにスコアが入力されたら、呼び出しmy_fixture.correct_predictionsて正しい予測をすべて取得できます (データベース アダプタによっては条件を変更する必要がある場合があります)。

于 2013-05-14T11:25:37.973 に答える
0

わかりましたので、これは間違った方法かもしれませんが、これを機能させることができました。最終的なコードは次のようになります

 def get_results # Get me all results
  doc = Nokogiri::HTML(open(RESULTS_URL))
  days = doc.css('.table-header').each do |h2_tag|
  date = Date.parse(h2_tag.text.strip).to_date
  matches = h2_tag.xpath('following-sibling::*[1]').css('tr.report')
    matches.each do |match|
     home_team = match.css('.team-home').text.strip
     away_team = match.css('.team-away').text.strip
     score = match.css('.score').text.strip
     home_score, away_score = score.split("-").map(&:to_i)
     fixture = Fixture.where(fixture_date: date, home_team: home_team, away_team: away_team).first
     prediction_array = Prediction.where(fixture_id: fixture)

     pred = prediction_array.map {|p| p.id}
      pred.each do |p|
      pred_id = p
      Result.create!(home_team: home_team, away_team: away_team, fixture_date: date, home_score: home_score, away_score: away_score, prediction_id: pred_id)
     end
   end
 end
end

私が追加したのはこれでした

 fixture = Fixture.where(fixture_date: date, home_team: home_team, away_team: away_team).first
     prediction_array = Prediction.where(fixture_id: fixture)

     pred = prediction_array.map {|p| p.id}
      pred.each do |p|
      pred_id = p

したがって、取得中の結果から、date、home_team、away_team に一致するすべての試合を取得します。次に、fixture_id がフィクスチャによって受信された ID と一致するすべての予測を取得します。

次に、それらをマップし、それらを繰り返し処理し、その値を pred_id に割り当てます

于 2013-05-14T14:59:19.707 に答える
-1

Prediction belongs_to Fixture 関連付けがある場合は、次のようにすることができます。fixture.prediction

于 2013-05-14T11:09:40.567 に答える