2013-12-16 53 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

相關問題