我建议使用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'"