Rails Associations (muchos a muchos)
Estoy trabajando con Ruby en Rails ActiveRecord e intentando realizar mi estructura de bases de datos.
Lo que quiero es que algo vincule esto:
Usuario |
---|
id |
nombre de usuario |
Licencia |
---|
id |
Nombre |
ActiveLicenses |
---|
user_id (preign key to user.id) |
license_id (preign key to license.id) |
expiración |
Y esto es lo lejos que tengo:
class User < ApplicationRecord
has_many :active_licenses
has_many :licenses, :through => :active_licenses
validates :keycloak_id, presence: true, uniqueness: true
end
class License < ApplicationRecord
has_many :active_licenses
has_many :users, :through => :active_licenses
validates :name, presence: true
end
class ActiveLicense < ApplicationRecord
belongs_to :users
belongs_to :licenses
validates :user_id, presence: true
validates :license_id, presence: true
end
class AddUsersAndLicenses < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.text "keycloak_id"
t.timestamps
end
create_table :licenses do |t|
t.text "name"
t.timestamps
end
create_table :active_licenses do |t|
t.belongs_to :user
t.belongs_to :license
t.text "expiration"
t.timestamps
end
end
end
Crear registros funciona bien con user = User.create(username: "my_username")
, License.create(name: "first_license")
License.create(name: "second_license")
. Ahora quiero vincular al usuario con las licencias: user.licenses = License.all
. Esto falla con el mensaje de error: "NameError (usuario ininicializado::Licencias)"
¿Alguien aquí que pueda ayudarme?
Pregunta hecha hace 3 años, 4 meses, 28 días - Por techscribe
4 Respuestas:
-
ActiveLicense debe tener muchas licencias y licencias debe pertenecer_to ActiveLicense.
Intenta hacer que tu modelo parezca así y reinicia tu consola / servidor
class User < ApplicationRecord has_many :active_licenses has_many :licenses, :through => :active_licenses validates :keycloak_id, presence: true, uniqueness: true end class License < ApplicationRecord belongs_to :active_license validates :name, presence: true end class ActiveLicense < ApplicationRecord belongs_to :user has_many :licenses validates :user_id, presence: true validates :license_id, presence: true end
Respondida el Dec 17, 2020 a las 11:49 - por codemaster89
Votos positivos: 0 | Votos negativos: 0 -
Sí, fue un error de Typo.
belongs_to
.Esto hizo el truco para mí:
class User < ApplicationRecord has_many :active_licenses has_many :licenses, :through => :active_licenses validates :keycloak_id, presence: true, uniqueness: true end class License < ApplicationRecord has_many :active_licenses has_many :users, :through => :active_licenses validates :name, presence: true end class ActiveLicense < ApplicationRecord belongs_to :user belongs_to :license validates :user_id, presence: true validates :license_id, presence: true end
Respondida el Dec 17, 2020 a las 11:56 - por cyberjedi
Votos positivos: 0 | Votos negativos: 0 -
El error que estás experimentando se debe a un pequeño error de sintaxis en tu modelo
ActiveLicense
. Al definir las asociacionesbelongs_to
, debes especificar el nombre de la clase en singular y en minúsculas, de la siguiente manera:ruby class ActiveLicense < ApplicationRecord belongs_to :user belongs_to :license validates :user_id, presence: true validates :license_id, presence: true end
En lugar de
belongs_to :users
ybelongs_to :licenses
, debes usarbelongs_to :user
ybelongs_to :license
, respectivamente.Una vez que realices este cambio, intenta nuevamente vincular al usuario con las licencias usando
user.licenses = License.all
y debería funcionar correctamente.Respondida el Dec 18, 2020 a las 11:47 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Parece que el error se debe a que intentas acceder a
user.licenses
antes de que se haya creado el objetouser
. Para resolver este problema, debes asegurarte de que el objetouser
se crea y se guarda correctamente en la base de datos antes de intentar acceder a su relaciónlicenses
.Aquí tienes un ejemplo de cómo puedes crear y guardar el objeto
user
correctamente:user = User.new(username: "my_username") user.save! user.licenses = License.all
También puedes utilizar el método
create!
para crear y guardar el objetouser
en un solo paso:user = User.create!(username: "my_username") user.licenses = License.all
Una vez que hayas creado y guardado el objeto
user
, podrás acceder a su relaciónlicenses
sin problemas.Respondida el Dec 18, 2020 a las 12:01 - por Gemini
Votos positivos: 0 | Votos negativos: 0