1

私は現在、私たちの学校のスポーツ アカデミーが競技成績を保存してランク付けできるようにするオンライン アプリケーションを開発しています。2 つの別々のデータベースからの情報を結合しようとしています -ResultsそしてAthletes

Athletesなどの情報が含まれてい:name :gender :ageます。
Resultsを含む情報が含まれています。:name :event :performance

イベントに加えて、年齢や性別で結果をフィルタリングしたいと思います。
表示するデータのユーザー設定を指定するコードを設定し、値を設定し:justgender :justage:justevent

ただし、それに応じて結果をフィルタリングするのに苦労しています。

おそらく最も簡単な方法は、2 つのモデル間に「属する」関係を設定することで、名前を識別子として使用できるようです。ただし、通常、これが使用される場合、ユーザーは特定の値をパラメーターとして保存し、これを使用して、たとえばコメントを正しい投稿に関連付けることができます。

ユーザーが結果を入力し、アスリート名を指定できるようにする方法を設定したいと思います。これを使用してAthletes、結果を関連付けるために識別されるデータベース内のエントリを識別します。これが完了したら、SQL フィルターを使用して一致する結果を引き出すことができると思いますか?

ご協力いただきありがとうございます

4

1 に答える 1

1

関連付けを使用してこれを行うことをお勧めしhas_manyます。生活を少し簡素化し、モデルの不要な:name属性を削除します。Result

class Athlete < ActiveRecord::Base
  has_many :results

  # == Schema Information
  #
  # Table name: athletes
  #
  #  id         :integer         not null, primary key
  #  name       :string(255)
  #  gender     :string(255)
  #  age        :integer
  #  created_at :datetime
  #  updated_at :datetime
end

class Result < ActiveRecord::Base      
  belongs_to :athlete

  # == Schema Information
  #
  # Table name: results
  #
  #  id           :integer         not null, primary key
  #  athlete_id   :integer
  #  event        :string(255)
  #  performance  :integer
  #  created_at   :datetime
  #  updated_at   :datetime
end

そして、あなたの検索は次のようになります:

@results_by_age = Result.joins(:athlete).where(:athletes => { :name => params[:name], :age => params[:age] })
@results_by_event = Result.where(:event => params[:event]).joins(:athlete).where(:athletes => { :name => params[:name] })
@results_by_gender = Result.joins(:athlete).where(:athletes => { :name => params[:name], :gender => params[:gender] })

結果の SQL は次のようになります。

# Filtered by name and age
"SELECT \"results\".* FROM \"results\" INNER JOIN \"athletes\" ON \"athletes\".\"id\" = \"results\".\"athlete_id\" WHERE \"athletes\".\"name\" = 'Bob' AND \"athletes\".\"age\" = 25"

# Filtered by event and name
"SELECT \"results\".* FROM \"results\" INNER JOIN \"athletes\" ON \"athletes\".\"id\" = \"results\".\"athlete_id\" WHERE \"results\".\"event\" = 'Something' AND \"athletes\".\"name\" = 'Bob'"

# Filtered by name and gender 
"SELECT \"results\".* FROM \"results\" INNER JOIN \"athletes\" ON \"athletes\".\"id\" = \"results\".\"athlete_id\" WHERE \"athletes\".\"name\" = 'Bob' AND \"athletes\".\"gender\" = 'Confused'"
于 2012-01-12T09:27:54.877 に答える