1

我目前正在开发一个在线应用程序,使我们学校的体育学院能够存储和排名他们的比赛成绩。我正在尝试合并来自 2 个独立数据库的信息 -ResultsAthletes

Athletes包含诸如:name :gender :age.
Results包含的信息包括:name :event :performance

除了事件之外,我还想按年龄和/或性别过滤结果。
我已经设置了代码来指定要显示的数据的用户首选项,为:justgender :justage和设置值:justevent

但是,我正在努力相应地过滤结果。

看来最简单的方法大概就是在两个模型之间建立一个“属于”的关系,名字可以作为标识符。但是,通常在使用此功能时,用户会将某个值存储为参数,这可用于将评论与正确的帖子相关联。

我想设置一种方法,使用户能够输入结果,指定运动员姓名,这用于识别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 回答