2013-12-16 2 views
7

Ich habe die Dokumentationen und Tonnen von Tutorials über die has_many gelesen: durch Beziehungen in Rails, aber ich kann nicht für das Leben von mir den Dreh raus.has_many: durch nicht initialisierte Konstante

Ich versuche, eine Gruppe zu meinem current_user (Gerät) hinzuzufügen, und ich habe eine Tabelle zwischen Group und User mit einem Status (Der Status des Benutzers ist für diese Gruppe änderbar).

Jedes Mal, wenn ich eine neue Gruppe erstellen, jetzt bekomme ich eine Fehlermeldung, uninitialized constant Group::GroupUser

hier meine Modelle sind:

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 

und die damit verbundenen Sachen von 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 

Und schließlich. die Zeile, die den Fehler

@group.users << current_user 
+1

versucht Vielleicht die Datei Aufruf 'group_user.rb' ? –

Antwort

17

Das Problem, das ich sehen wirft, ist Ihre Benennung von GroupUser

Wir Modelle die ganze Zeit beitreten zu verwenden, und wir sie auch mit einem Unterstrich nennen:

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

Der nicht initialisierte konstante Fehler wird dadurch verursacht, dass das Modell nicht korrekt geladen wird, was ich aufgrund des Namensproblems vermute. Wenn das nicht funktioniert, sollten Sie das Modell mit dem :class_name Parameter in Ihrer Beziehung Erklärungen verweisen:

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

aktualisieren

We wanted to call extra attributes aus dem Modell verbinden, und fand auf diese Weise:

#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 

Dies verwendet die select-Methode, die Sie bei der Erstellung verwenden können ein Active Verein, und wie wir discovered from this RailsCast, können Sie verwenden, alias Spalten in Ihren Anfragen

für Sie zu erstellen, können Sie möchten, dies versuchen:

#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

Wow; Es war so einfach, oder? Danke vielmals! Klappt wunderbar. – CaptainCarl

+0

Kein Problem Kumpel - manchmal sind es die einfachsten Dinge! –

+0

Ich habe den Namen in Groupuser für die einfachere Verwendung geändert :-) Schnelle Frage aber: Wie bekomme ich den Status von group_users für jeden Benutzer anzeigen? Denn wenn ich meine Group.all durchschleife und 'individualGroup.groupusers.status 'mache, scheint nichts da zu sein. ('individualGroup.groupusers' tut das!) – CaptainCarl