has_many:通过未初始化的常量

我已经阅读了关于has_many的文档和大量的教程:通过Rails中的关系,但我不能为我的生活搞定它。

我正在尝试将一个组添加到我的current_user(设计)中,并且我在GroupUser之间有一个表具有状态(该组的用户状态可以更改)。

每当我创建一个新组时,我会收到一条错误,指出uninitialized constant Group::GroupUser

这是我的模特:

groupuser.rb

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

group.rb

 class Group  :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  :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 

以及来自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 

最后。 抛出错误的行

 @group.users << current_user 

我能看到的问题是你对GroupUser的命名

我们一直使用连接模型,我们也用下划线命名它们:

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

未初始化的常量错误将由模型未正确加载引起,我认为这将归因于命名问题。 如果这不起作用,则应在关系声明中使用:class_name参数引用模型:

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

更新

我们想从连接模型中调用额外的属性 ,并找到这种方式:

 #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 

这使用了在创建ActiveRecord关联时可以使用的select方法,正如我们从这个RailsCast中发现的那样 ,您可以使用它在查询中创建alias 名列

对你而言,你可以试试这个:

 #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