1

我目前正在開發一個在線應用程序,使我們學校的體育學院能夠存儲和排列他們的比賽表現。我試圖結合來自2個獨立數據庫的信息 - ResultsAthletes如何定義數據庫關聯

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

我想過濾的年齡和/或性別的結果,除了事件。
我已經設置了代碼來指定數據顯示用戶的偏好,爲:justgender :justage:justevent

設定值。但是,我奮力相應篩選結果。

看來最簡單的方法可能是在兩個模型之間建立一個「屬於」關係,名稱可以用作標識符。但是,通常當使用這個參數時,用戶將有一個存儲爲參數的特定值,並且這可以用於將該評論與例如正確的帖子相關聯。

我想建立一種方法,使用戶能夠輸入結果,指定運動員姓名,這用於識別Athletes數據庫中要識別的條目以將結果與之關聯。我假設一旦完成,我可以使用SQL過濾器來提取匹配結果?

感謝您的幫助

回答

1

我會建議使用has_many協會這樣做。它會簡化你的生活並消除Result模型中不必要的:name屬性。

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