2017-03-02 1 views
0

Ich versuche, eine has_many durch Beziehung so zu machen:Struggling has_many durch Beziehung hinzufügen

#user.rb 
class User < ApplicationRecord 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :availabilities 
    has_many :timeslots, :through => availabilities 
end 

#availability.rb 
class Availability < ApplicationRecord 
    belongs_to :timeslot 
    belongs_to :user 
end 

#timeslot.rb 
class Timeslot < ApplicationRecord 
    has_many :availabilities 
    has_many :timeslots, :through => availabilities 
end 

ich die beiden Modelle erstellt und als rake db:migrate lief den Code in den Modellen ohne Zusatz (zum Erstellen der Tabellen) . Ich habe eine Migrationsdatei:

class AddFieldsToTables < ActiveRecord::Migration[5.0] 
    def change 
    add_column :users, :availability_id, :integer 
    add_column :timeslots, :availability_id, :integer 
    add_column :availabilities, :user_id, :integer 
    add_column :availabilities, :timeslot_id, :integer 
    end 
end 

und lief rake db:migrate , als ich den obigen Code zu allen Dateien hinzugefügt. Und dann, wenn ich versuche, etwas zu generieren, gibt es mir NameError: undefined local variable or method availabilities for User (call 'User.connection' to establish a connection):Class

Ich bin neu in Ruby on Rails.

Antwort

1

Ein Problem, das ich sehe, ist, dass in Ihrem timeslot.rb Sie has_many :timeslots, :through => availabilities haben. Ich schätze, Sie wollen has_many :users, :through => :availabilites.

Eine andere ist in user.rb, Sie haben has_many :timeslots, :through => availabilities, aber Sie brauchen das Symbol :availabilites. Dies ist der Grund für den Fehler, den Sie gemeldet haben, glaube ich. Es soll wie folgt aussehen (alles, was ich geändert habe, ist die zweite-to-letzte Zeile):

class User < ApplicationRecord 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :availabilities 
    has_many :timeslots, :through => :availabilities 
end 
+0

ist nicht verfügbar die Plural von Availability. – DrevanTonder

+0

Versuchen Sie, dies ist in 'Benutzer.rb' und du wirst sehen was ich meine: 'has_many: timeslots,: through =>: availabilities' –

+0

Entschuldigung, ich dachte du meinst das Plural der Verfügbarkeit ist verfügbar. Ich sehe was du jetzt meinst. – DrevanTonder

1

Ich sehe ein kleines Problem in Ihrem Code:

#timeslot.rb 
class Timeslot < ApplicationRecord 
    has_many :availabilities 
    has_many :users, :through => availabilities 
end 

Ich bin mir nicht sicher, ob es Ihr Problem lösen können, aber Ihr Code (schließen die oben Fehler:

#timeslot.rb 
class Timeslot < ApplicationRecord 
    has_many :availabilities 
    has_many :timeslots, :through => availabilities 
end 

es sein sollte) klingt gut für mich.

+0

oops Kopieren einfügen Problem. Obwohl ich immer noch den Fehler bekomme. Danke trotzdem. – DrevanTonder

+1

Ich sehe hier ein anderes Problem: Sie sollten "Verfügbarkeiten" als Symbol (': Verfügbarkeiten ') sowohl in' user.rb' als auch in 'timeslot.rb' verwenden. Es sollte das Problem lösen. –

0

Um Setup has_many through Beziehung zwischen zwei Tabellen users und timeslots, den Sie einrichten müssen Join-Tabelle availabilities mit Spalten user_id und timeslot_id.

Richten Sie Ihre Schienen Modelle wie unten:

# models/user.rb 
class User < ApplicationRecord 
    has_many :availabilities 
    has_many :timeslots, :through => :availabilities 
end 

# models/availability.rb 
# projects table should have these columns - user_id:integer, timeslot_id:integer 
class Availability < ApplicationRecord 
    belongs_to :timeslot 
    belongs_to :user 
end  

# models/timeslot.rb 
class Timeslot < ApplicationRecord 
    has_many :availabilities 
    has_many :users, :through => :availabilities 
end 

Sie brauchen eine Migration availabilities Tabelle zu erstellen, die zwischen Timeslot Objekt und User Objekt für Ihre has_many durch Beziehung als Join-Tabelle fungiert. Migration-Datei sieht dies so etwas wie:

class CreateAvailabilities < ActiveRecord::Migration[5.0] 
    def change 
    create_table :availabilities do |t| 
     t.integer :user_id 
     t.integer :timeslot_id 
    end 
    end 
end 

Zugang

User.last.timeslots 0 gibt, 1 oder viele Zeitschlitze im Zusammenhang mit User.last

Timeslot.last.users gibt 0, 1 oder viele Benutzer im Zusammenhang mit Timeslot.last

Verwandte Themen