我目前正在开发一个在线应用程序,使我们学校的体育学院能够存储和排列他们的比赛表现。我正在尝试合并来自2个独立数据库的信息 - Results
和Athletes
Athletes
包含:name :gender :age
等信息
Results
包含的信息包括:name :event :performance
除了活动之外,我想按年龄和/或性别过滤结果
我已设置代码以指定要显示的数据的用户首选项,为:justgender :justage
和:justevent
设置值
但是,我很难相应地过滤结果。
似乎最简单的方法可能是在两个模型之间建立“属于”关系,该名称可以用作标识符。然而,通常在使用它时,用户将具有存储为参数的特定值,并且这可以用于将评论例如与正确的帖子相关联。我想设置一个方法,使用户能够输入结果,指定运动员名称,并用于识别要识别的Athletes
数据库中的条目以将结果与之关联。我假设一旦完成,我可以使用SQL过滤器来提取匹配结果吗?
感谢您的帮助
答案 0 :(得分: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'"