2011-02-07 4 views
0

J'ai un calendrier et une base de données d'équipes pour montrer les matchs de football. Je peux actuellement voir tous les appareils (index & show ..) et toutes les équipes (index seulement).Rails appartient à class_name avec les clés étrangères correctes?

create_table "fixtures", :force => true do |t| 
    t.integer "home_id" 
    t.integer "away_id" 
    t.date  "date" 
    ... 

    create_table "teams", :force => true do |t| 
    t.string "name" 
    ... 

Mon luminaire & Les modèles d'équipe sont présentés ci-dessous;

class Fixture < ActiveRecord::Base 
    belongs_to :home, :class_name => 'Team' 
    belongs_to :away, :class_name => 'Team' 
    ... 
class Team < ActiveRecord::Base 
    has_many :fixtures 
    ... 

je reçois l'erreur suivante lorsque vous essayez d'afficher une des équipes accessoires sur 'équipes # show page

Processing by TeamsController#show as HTML 
    Parameters: {"id"=>"3"} 
    Team Load (0.4ms) SELECT "teams".* FROM "teams" WHERE ("teams"."id" = 3) LIMIT 1 
    Fixture Load (0.3ms) SELECT "fixtures".* FROM "fixtures" 
    Fixture Load (0.3ms) SELECT "fixtures".* FROM "fixtures" WHERE ("fixtures".team_id = 3) 
SQLite3::SQLException: no such column: fixtures.team_id: SELECT "fixtures".* FROM "fixtures" WHERE ("fixtures".team_id = 3) 

Je comprends l'erreur dit qu'il cherche team_id dans les appareils mais n » t existe car j'ai un home_id et un away_id car chaque appareil contient toujours deux équipes, alors comment puis-je créer une recherche pour afficher les appareils d'une équipe?

Répondre

0

Je souhaite qu'il y avait un bon moyen de le faire aussi, mais il n'y en a pas vraiment. Probablement les meilleures solutions de contournement sont:

  1. avoir deux has_many s, :home_fixtures et :away_fixtures, puis une méthode fixtures qui retourne l'union des deux (voir this question pour plus de détails).
  2. Pour ignorer complètement le has_many s et écrire simplement une méthode fixtures qui vous donne ce que vous voulez sans avoir réellement et la relation ActiveRecord mis en place.

Comme si (Rails 2.3-Style):

def fixtures 
    return Fixture.all(:conditions => ['away_id = :id OR home_id = :id', {:id => self.id}]) 
end 

Hope this helps!

+0

Je ne pense pas que je comprenne la première façon, j'ai eu une erreur de méthode privée en utilisant le 2ème. Dans mon équipe, j'ai défilé show @team = Team.find (params [: id]) @fixtures = Fixture.all (: conditions => ['away_id =: id OU home_id =: id', {: id => @ team.id}]) fin ... Je l'ai eu en travaillant en changeant self.id à @ team.id –

+0

@raphael_turtle J'avais envisagé la méthode allant dans le modèle d'équipe, mais je suppose que j'ai oublié de mentionner cela. Désolé - content que tu l'aies fonctionné quand même! –

Questions connexes