2013-12-16 57 views
7

我已阅读关于has_many的文档和大量教程:通过Rails中的关系,但我不能为我的生活弄到它的窍门。has_many:通过未初始化的常量

我想添加一个组到我的current_user(设计),我有一个表之间GroupUser状态(该用户的状态是可更改的该组)。

每当我现在创建一个新的集团,我得到一个错误说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 
+1

也许尝试调用文件'group_user.rb' ? Wow; –

回答

17

我能看到的问题是你的GroupUser

命名我们使用连接模型的时候,我们也用下划线他们的名字:

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

未初始化的常量错误将由未正确加载的模型引起,我想这将归结于命名问题。从加盟模式

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

更新

We wanted to call extra attributes,发现这样的:如果不工作,你应该参考与:class_name参数模型在关系声明

#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协会,并作为我们discovered from this 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 
+1

哇;这很简单,是吧?非常感谢!奇迹般有效。 – CaptainCarl

+0

没问题的朋友 - 有时候,这是最简单的事情! –

+0

我已将名称更改为Groupuser,以便于使用:-) 尽管如此快速提问:如何从group_users获取状态以便为每个用户显示?因为当我循环访问Group.all并执行'individualGroup.groupusers.status'时,似乎没有任何东西存在。 ('individualGroup.groupusers'确实!) – CaptainCarl

相关问题