through references rails many has_one has_many has_and_belongs_to_many has example belongs_to belongs and ruby-on-rails ruby-on-rails-4 has-many-through

ruby on rails - references - has_many: a través de la constante no inicializada



rails has_one through (1)

He leído la documentación y montones de tutoriales sobre has_many: a través de las relaciones en Rails, pero no puedo, por el resto de la vida, acostumbrarme a eso.

Estoy intentando agregar un grupo a mi usuario_actual (idear) y tengo una tabla entre Group y User con un estado (El estado del usuario es variable para ese grupo).

Cada vez que creo un nuevo grupo ahora recibo un error que dice uninitialized constant Group::GroupUser

aquí están mis modelos:

groupuser.rb

class GroupUser < ActiveRecord::Base belongs_to :group belongs_to :user end

group.rb

class Group < ActiveRecord::Base has_many :clients has_and_belongs_to_many :pictograms has_many :group_users has_many :users, :through => :group_users accepts_nested_attributes_for :clients validates_length_of :name, :minimum => 5 validates_presence_of :name validates_presence_of :background validates_presence_of :clocktype end

User.rb

class User < ActiveRecord::Base # Include default devise modules. Others available are: # :token_authenticatable, :confirmable, # :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable validates_presence_of :first_name validates_presence_of :last_name validates :email, presence: true, uniqueness: true has_many :group_users has_many :groups, :through => :group_users has_attached_file :avatar, :styles => { :medium => "300x300#", :thumb => "100x100#" } validates_attachment_content_type :avatar, :content_type => [''image/jpg'', ''image/png'', ''image/jpeg''] validates_attachment :avatar, :size => { :in => 0..1.megabytes } def completeName "#{self.first_name} #{self.last_name}" end end

Y las cosas relacionadas de schema.rb

create_table "group_users", id: false, force: true do |t| t.integer "group_id" t.integer "user_id" t.integer "status", default: 0 end add_index "group_users", ["group_id"], name: "index_group_users_on_group_id" add_index "group_users", ["user_id"], name: "index_group_users_on_user_id" create_table "groups", force: true do |t| t.string "name" t.integer "clocktype" t.string "background" t.datetime "created_at" t.datetime "updated_at" end create_table "users", force: true do |t| t.string "first_name" t.string "last_name" t.string "password" t.string "avatar_file_name" t.string "avatar_content_type" t.integer "avatar_file_size" t.datetime "avatar_updated_at" t.datetime "created_at" t.datetime "updated_at" t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.integer "sign_in_count", default: 0 t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" end add_index "users", ["email"], name: "index_users_on_email", unique: true add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

Y por último. la línea que arroja el error

@group.users << current_user


El problema que puedo ver es su nombre de GroupUser

Utilizamos modelos de combinación todo el tiempo, y también los nombramos con un guión bajo:

group_user.rb class GroupUser < ActiveRecord::Base belongs_to :group belongs_to :user end

El error constante no inicializado se debe a que el modelo no se carga correctamente, lo que imagino será debido al problema de nomenclatura. Si eso no funciona, debe hacer referencia al modelo con el parámetro :class_name en sus declaraciones de relación:

has_many :group_users, :class_name => ''GroupUser'' has_many :groups, :through => :group_users

Actualizar

Queríamos llamar atributos adicionales del modelo de unión, y encontrarlo de esta manera:

#app/models/message.rb has_many :image_messages, :class_name => ''ImageMessage'' has_many :images, -> { select("#{Image.table_name}.*, #{ImageMessage.table_name}.caption AS caption") }, :class_name => ''Image'', :through => :image_messages, dependent: :destroy

Utiliza el método de select que puede usar cuando creó una asociación de ActiveRecord, y como descubrimos desde este RailsCast , puede usar eso para crear columnas de alias en sus consultas

Para ti, puedes intentar esto:

#app/models/user.rb has_many :group_users, :class_name => ''Groupuser'' has_many :groups, -> { select("#{User.table_name}.*, #{Groupuser.table_name}.status AS status") }, :class_name => ''Group'', :through => :group_users, dependent: :destroy