has_many:通过未初始化的常量 [英] has_many :through uninitialized constant

查看:83
本文介绍了has_many:通过未初始化的常量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经阅读了有关has_many的文档和大量教程:通过Rails中的关系,但是我一生无法掌握它.

I've read the documentations and tons of tutorials about the has_many :through relations in Rails but I can't for the life of me get the hang of it.

我正在尝试向我的current_user(devise)添加一个组,并且我在GroupUser之间有一个状态为(该组的用户状态可以更改)的表.

I'm trying to add a group to my current_user(devise) and I have a table in between Group and User with a status(The user's status is changeable for that group).

每当我现在创建一个新的网上论坛时,都会出现一条错误消息,提示uninitialized constant Group::GroupUser

Whenever I create a new Group now I get an error saying uninitialized constant Group::GroupUser

这是我的模特:

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

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

我们一直在使用联接模型,并用下划线命名它们:

We use join models all the time, and we also name them with an underscore:

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

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

The uninitialized constant error will be caused by the model not loading correctly, which I imagine will be due to the naming issue. If that doesn't work, you should reference the model with the :class_name parameter in your relation declarations:

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


更新

我们想调用额外的属性从联接模型中,发现这种方式:

We wanted to call extra attributes from the join model, and found this way:

#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

这使用了select方法,您可以在创建ActiveRecord关联时使用该方法,就像我们

This uses the select method which you can use when you created an ActiveRecord association, and as we discovered from this RailsCast, you can use that to create alias columns in your queries

对于您来说,您不妨尝试一下:

For you, you may wish to try this:

#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

这篇关于has_many:通过未初始化的常量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆