Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 1
    Points : 0
    Points
    0

    Par défaut Relation n->m : uninitialized constant User::UserHasPin

    Bonjour,

    Je suis confronté à un problème dans le cadre de mon application rails.

    Voici mon model concernant la base de donnée (sous SQLite) :


    J'ai en effet l'exception suivante : (je voulais juste faire un test pour voir si j'arrive à compter le nombre pins pour un utilisateur)

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NameError in Users#show
     
    Showing /app/views/shared/_users_pins.html.erb where line #3 raised:
     
    uninitialized constant User::UserHasPin
    Extracted source (around line #3):
     
    1: <% @user ||= current_user %>
    2: <div class="stats">
    3:  <%= @user.pins_id.count %>
    4: </div>
    Voici les 3 models qui sont associés :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class UserHasPins < ActiveRecord::Base
      attr_accessible :users_id, :pins_id
      
     
      belongs_to :users_id
      belongs_to :pins_id
      
      
      validates :users_id, presence: true
      validates :pins_id, presence: true
    end
    Code :
    1
    2
    3
    4
    5
    6
    class User < ActiveRecord::Base
    
    
      has_many :pins_id, :through => :user_has_pin 
      has_many :user_has_pin
    end
    Code :
    1
    2
    3
    4
    5
    6
    7
    class Pins < ActiveRecord::Base
      attr_accessible :content, :title
      
      
      has_many :users_id, :through => :user_has_pin
      has_many :user_has_pin
    Si quelqu'un voit pourquoi j'ai cette exception ? =)

    Merci par avance de vos réponses

  2. #2
    Membre confirmé
    Homme Profil pro Vincent Charlet
    Ingénieur développement logiciels
    Inscrit en
    novembre 2011
    Messages
    155
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent Charlet
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : novembre 2011
    Messages : 155
    Points : 251
    Points
    251

    Par défaut

    Je suis pas fan du nomage de tes variables et par expérience (pour avoir galeré aussi) Ruby va utiliser les transformations singulier/pluriel pour retrouver le nom de la classe liée au has_many
    d'ailleurs tu peux le forcer en utilisant la variable :class

    Revenons à ton erreur: ton modele et tes relations ne sont pas correcte, commence par regler ça !

    je ferai tellement de changement que je ne sais pas par ou commencer, les noms des classes au singulier, les belong_to au singulier et les has_many au pluriel
    (et oui, c'est un maniac de la grammaire qui à créé ce langage)

    Code :
    1
    2
    3
    4
    class UserHasPin < ActiveRecord::Base
     
      belongs_to :user
      belongs_to :pin


    Code :
    1
    2
    3
    4
    5
    6
    class Pin < ActiveRecord::Base
      attr_accessible :content, :title
     
     
      has_many :users, :through => :user_has_pins, :source => :user
      has_many :user_has_pins
    ajout de la :source pour aider ruby à determiner le sens de la relation

    Code :
    1
    2
    3
    4
    5
    6
    class User < ActiveRecord::Base
     
     
      has_many :pins, :through => :user_has_pins, :source => :pin
      has_many :user_has_pins
    end
    j'ai pas testé mais j'ai un modele de base qui ressemble un peu ....

    Tu peux facilement tester en utilisant la console rails, en creant un objet et en appellant la methode, cela doit te renvoyer [] puisque le lien n'existe pas, mais cela ne doit pas te planter
    (attention à chaque modification du modele, il faut relancer la console pour prendre en compte les modifications

    bon courage !

  3. #3
    Membre confirmé
    Homme Profil pro Vincent Charlet
    Ingénieur développement logiciels
    Inscrit en
    novembre 2011
    Messages
    155
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent Charlet
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : novembre 2011
    Messages : 155
    Points : 251
    Points
    251

    Par défaut

    j'ai trouvé le temps de tester:
    Code :
    1
    2
    3
    4
     
    $ rails generate model user
    $ rails generate model pin
    $ rails generate model userHasPin
    je changerais aussi le nom de tes foreign keys
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class CreateUserHasPins < ActiveRecord::Migration
      def change
        create_table :user_has_pins do |t|
          t.integer :user_id
          t.integer :pin_id
     
          t.timestamps
        end
      end
    end
    mais ça marche beaucoup mieux

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    $ rails c
    Loading development environment (Rails 3.2.2)
    irb(main):001:0> p1 = Pin.create(:title => "Pokemon")
      &#8592;[1m&#8592;[36m (0.0ms)&#8592;[0m  &#8592;[1mbegin transaction&#8592;[0m
      &#8592;[1m&#8592;[35mSQL (37.0ms)&#8592;[0m  INSERT INTO "pins" ("created_at", "title", "updated_at") VALUES (?, ?, ?)  [["created_at", Fri, 27 Jul 2012 07:56:53 UTC +00:00], ["title", "Pokemon"], ["updated_at", Fri, 27 Jul 2012 0
    7:56:53 UTC +00:00]]
      &#8592;[1m&#8592;[36m (6.0ms)&#8592;[0m  &#8592;[1mcommit transaction&#8592;[0m
    => #<Pin id: 1, title: "Pokemon", created_at: "2012-07-27 07:56:53", updated_at: "2012-07-27 07:56:53">
    irb(main):002:0> p2 = Pin.create(:title => "Yugiho")
      &#8592;[1m&#8592;[35m (0.0ms)&#8592;[0m  begin transaction
      &#8592;[1m&#8592;[36mSQL (2.0ms)&#8592;[0m  &#8592;[1mINSERT INTO "pins" ("created_at", "title", "updated_at") VALUES (?, ?, ?)&#8592;[0m  [["created_at", Fri, 27 Jul 2012 07:57:06 UTC +00:00], ["title", "Yugiho"], ["updated_at", Fri, 27 Jul
    2012 07:57:06 UTC +00:00]]
      &#8592;[1m&#8592;[35m (8.0ms)&#8592;[0m  commit transaction
    => #<Pin id: 2, title: "Yugiho", created_at: "2012-07-27 07:57:06", updated_at: "2012-07-27 07:57:06">
    irb(main):003:0> u = User.create()
      &#8592;[1m&#8592;[36m (0.0ms)&#8592;[0m  &#8592;[1mbegin transaction&#8592;[0m
      &#8592;[1m&#8592;[35mSQL (2.0ms)&#8592;[0m  INSERT INTO "users" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", Fri, 27 Jul 2012 07:57:18 UTC +00:00], ["updated_at", Fri, 27 Jul 2012 07:57:18 UTC +00:00]]
      &#8592;[1m&#8592;[36m (5.0ms)&#8592;[0m  &#8592;[1mcommit transaction&#8592;[0m
    => #<User id: 1, created_at: "2012-07-27 07:57:18", updated_at: "2012-07-27 07:57:18">
    irb(main):004:0> u.user_has_pins.create(:pin_id => 1)
      &#8592;[1m&#8592;[35m (0.0ms)&#8592;[0m  begin transaction
      &#8592;[1m&#8592;[36mSQL (1.0ms)&#8592;[0m  &#8592;[1mINSERT INTO "user_has_pins" ("created_at", "pin_id", "updated_at", "user_id") VALUES (?, ?, ?, ?)&#8592;[0m  [["created_at", Fri, 27 Jul 2012 07:57:58 UTC +00:00], ["pin_id", 1], ["updated_at", Fri, 27 Jul 2012 07:57:58 UTC +00:00], ["user_id", 1]]
      &#8592;[1m&#8592;[35m (4.0ms)&#8592;[0m  commit transaction
    => #<UserHasPin id: 1, user_id: 1, pin_id: 1, created_at: "2012-07-27 07:57:58", updated_at: "2012-07-27 07:57:58">
    irb(main):005:0> u.pins
      &#8592;[1m&#8592;[36mPin Load (0.0ms)&#8592;[0m  &#8592;[1mSELECT "pins".* FROM "pins" INNER JOIN "user_has_pins" ON "pins"."id" = "user_has_pins"."pin_id" WHERE "user_has_pins"."user_id" = 1&#8592;[0m
    => [#<Pin id: 1, title: "Pokemon", created_at: "2012-07-27 07:56:53", updated_at: "2012-07-27 07:56:53">]
    irb(main):006:0> p1.users
      &#8592;[1m&#8592;[35mUser Load (1.0ms)&#8592;[0m  SELECT "users".* FROM "users" INNER JOIN "user_has_pins" ON "users"."id" = "user_has_pins"."user_id" WHERE "user_has_pins"."pin_id" = 1
    => [#<User id: 1, created_at: "2012-07-27 07:57:18", updated_at: "2012-07-27 07:57:18">]
    irb(main):007:0> p2.users
      &#8592;[1m&#8592;[36mUser Load (1.0ms)&#8592;[0m  &#8592;[1mSELECT "users".* FROM "users" INNER JOIN "user_has_pins" ON "users"."id" = "user_has_pins"."user_id" WHERE "user_has_pins"."pin_id" = 2&#8592;[0m
    => []

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •