ruby on rails has_many: uninitialized निरंतर के माध्यम से



ruby-on-rails ruby-on-rails-4 (1)

मैंने दस्तावेजों और ट्यूटोरियल के कई पढ़े हैं- रेलवे में संबंधों के माध्यम से, लेकिन मैं उसके जीवन के लिए इसे लटकाने में असमर्थ हूं।

मैं एक समूह को अपने चालू_उसर (devise) से जोड़ने की कोशिश कर रहा हूं और मेरे पास Group और User बीच एक स्थिति है (उस समूह के लिए उपयोगकर्ता की स्थिति बदलती है)।

जब भी मैं एक नया समूह uninitialized constant Group::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

और स्कीमा.आरबी से संबंधित सामान

  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 नामकरण है

हम सभी समय में शामिल होने के मॉडल का उपयोग करते हैं, और हम उन्हें अंडरस्कोर के साथ भी नाम देते हैं:

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

मॉडल को सही ढंग से नहीं लोड करने के कारण असंतुलित निरंतर त्रुटि होगी, जिसे मैं कल्पना करता हूं कि नामकरण समस्या के कारण होगा। अगर वह काम नहीं कर रहा है, तो आपको अपने संबंध घोषणाओं में :class_name पैरामीटर के साथ मॉडल को संदर्भित करना चाहिए:

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

अद्यतन करें

हम शामिल होने के मॉडल से अतिरिक्त विशेषताओं को कॉल करना चाहते थे , और इस तरह से पाया:

#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 एसोसिएशन बनाते समय उपयोग कर सकते हैं, और जैसा कि हमने इस 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