has_many:通过未初始化的常量 [英] has_many :through uninitialized constant
问题描述
我已经阅读了有关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)添加一个组,并且我在Group
和User
之间有一个状态为(该组的用户状态可以更改)的表.
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屋!