如何定义数据库关联

时间:2012-01-12 08:23:12

标签: ruby-on-rails ruby-on-rails-3 sqlite filtering model-associations

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

Athletes包含:name :gender :age等信息 Results包含的信息包括:name :event :performance

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

但是,我很难相应地过滤结果。

似乎最简单的方法可能是在两个模型之间建立“属于”关系,该名称可以用作标识符。然而,通常在使用它时,用户将具有存储为参数的特定值,并且这可以用于将评论例如与正确的帖子相关联。

我想设置一个方法,使用户能够输入结果,指定运动员名称,并用于识别要识别的Athletes数据库中的条目以将结果与之关联。我假设一旦完成,我可以使用SQL过滤器来提取匹配结果吗?

感谢您的帮助

1 个答案:

答案 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'"