Asociacións Configuración Resultados Correctamente en un Constante Uninicializado

Tengo un simple many_to_many relación entre User y Stake a través de UserStake, todo parece estar preparado correctamente pero resulta en NameError (uninitialized constant User::Stakes):

#db/schema.rb
ActiveRecord::Schema.define(version: 2020_12_19_070749) do

  create_table "stakes", force: :cascade do |t|
    t.string "address"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "user_stakes", force: :cascade do |t|
    t.integer "user_id"
    t.integer "stake_id"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "users", force: :cascade do |t|
    t.string "username"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.string "password_digest"
  end

end
#app/models/stake.rb
class Stake < ApplicationRecord
    has_many :active_stakes
    has_many :user_stakes
    has_many :users, through: :user_stakes
end

#app/models/user.rb
class User < ApplicationRecord
    has_many :user_stakes
    has_many :stakes, through: :user_stakes
    
    has_secure_password
end

#app/models/user_stake.rb
class UserStake < ApplicationRecord
    belongs_to :users
    belongs_to :stakes
end

Cuando pruebe la asociación a través de rails c el siguiente error NameError (uninitialized constant User::Stakes) aparece:

2.6.3 :019 > s
 => # 
2.6.3 :020 > u
 => # 
2.6.3 :021 > u.stakes << s
Traceback (most recent call last):
        1: from (irb):21
NameError (uninitialized constant User::Stakes)
2.6.3 :022 > u.stakes
Traceback (most recent call last):
        2: from (irb):22
        1: from (irb):22:in `rescue in irb_binding'
NameError (uninitialized constant User::Stakes)

Pregunta hecha hace 3 años, 4 meses, 27 días - Por quantumcoder403a


3 Respuestas:

  • pertenece_a las asociaciones deben usar el término singular.

    #app/models/user_stake.rb
    class UserStake < ApplicationRecord
        belongs_to :user
        belongs_to :stake
    end
    

    The belong_to Association

    pertenece_a las asociaciones deben usar el término singular. Si utilizó la forma pluralizada en el ejemplo anterior para la asociación autor en el modelo Book y trató de crear la instancia por Book.create(autores: @autor), se le diría que había un "Libro constante ininicializado::Authors". Esto se debe a que Rails infiere automáticamente el nombre de clase del nombre de asociación. Si el nombre de asociación está mal pluralizado, entonces la clase inferida también se pluralizará erróneamente.

    Respondida el Dec 19, 2020 a las 07:54 - por pixelpioneerx

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando se debe a una incongruencia en la nomenclatura de las asociaciones en tus modelos. El error específico "uninitialized constant User::Stakes" indica que Rails no puede encontrar la constante "Stakes" dentro de la clase User.

    Para corregir este error, debes ajustar la nomenclatura de las asociaciones en tus modelos de la siguiente manera:

    En el modelo UserStake, debes corregir las asociaciones para que coincidan con los nombres de las tablas:

    ruby
    

    app/models/user_stake.rb

    class UserStake < ApplicationRecord belongs_to :user belongs_to :stake end

    En el modelo Stake, ajusta la asociación de la siguiente manera:

    ruby
    

    app/models/stake.rb

    class Stake < ApplicationRecord has_many :active_stakes has_many :user_stakes has_many :users, through: :user_stakes end

    Por último, en el modelo User, asegúrate de que estés refiriéndote correctamente a la asociación:

    ruby
    

    app/models/user.rb

    class User < ApplicationRecord has_many :user_stakes has_many :stakes, through: :user_stakes has_secure_password end

    Guarda los cambios en los modelos y vuelve a intentar la asociación en la consola de Rails. Con estas correcciones, el error "uninitialized constant User::Stakes" debería desaparecer y tu asociación many-to-many entre User y Stake debería funcionar correctamente.

    Respondida el Dec 20, 2020 a las 07:50 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error NameError (uninitialized constant User::Stakes) se produce porque Rails no puede encontrar la constante Stakes en el modelo User. Esto se debe a que la asociación has_many :stakes no se ha configurado correctamente en el modelo User.

    Para resolver este problema, debes asegurarte de que la asociación has_many :stakes esté configurada correctamente en el modelo User. Debes agregar el siguiente código al modelo User:

    ruby
    class User < ApplicationRecord
      has_many :user_stakes
      has_many :stakes, through: :user_stakes
    
      

    Otras configuraciones

    end

    Este código creará una constante Stakes en el modelo User, que permitirá que Rails encuentre la asociación cuando se llame a u.stakes.

    Después de realizar este cambio, deberías poder acceder a la asociación stakes desde el modelo User sin encontrar el error NameError.

    Respondida el Dec 20, 2020 a las 07:55 - por Gemini

    Votos positivos: 0 | Votos negativos: 0