Как определить связь с базой данных - PullRequest
1 голос
/ 12 января 2012

В настоящее время я разрабатываю онлайн-приложение, позволяющее спортивной академии в нашей школе сохранять и оценивать свои соревновательные выступления.Я пытаюсь объединить информацию из 2 отдельных баз данных - Results и Athletes

Athletes содержит такую ​​информацию, как :name :gender :age.
Results содержит информацию, включая :name :event :performance

Я хотел бы отфильтровать результаты по возрасту и / или полу в дополнение к событию.
Я настроил код, чтобы указать предпочтения пользователя для отображаемых данных, установив значение для :justgender :justage и :justevent

Однако я изо всех сил пытаюсь отфильтровать результаты соответствующим образом.

Кажется, что самый простой способ, вероятно, состоит в том, чтобы установить отношение «принадлежит» между двумя моделями, имя можетиспользоваться в качестве идентификатора.Однако, как правило, когда это используется, у пользователя будет определенное значение, сохраняемое в качестве параметра, и это можно использовать, например, чтобы связать комментарий с правильным сообщением.

Я хотел бы настроить метод, позволяющий пользователю вводить результат, указывать имя спортсмена, и это будет использоваться для идентификации записи в базе данных Athletes, которую необходимо идентифицировать для сопоставления результата.Я предполагаю, что, как только это будет сделано, я могу просто использовать фильтр SQL для извлечения результатов сопоставления?

Спасибо за вашу помощь

1 Ответ

1 голос
/ 12 января 2012

Я бы порекомендовал сделать это, используя 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'"
...