2017-03-02 33 views
0

我想通過這樣的關係做出的has_many添加的has_many:掙扎通過關係

#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 

我創建的兩個模型和比沒有在模型中添加代碼跑rake db:migrate(創建表) 。 我做了一個遷移文件:

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 

rake db:migrate 比我上面添加的所有文件的代碼。 然後,如果我嘗試生成任何東西,它會給我NameError: undefined local variable or method availabilities for User (call 'User.connection' to establish a connection):Class

我是Ruby on Rails的新手。

回答

1

我看到的一個問題是,在您的timeslot.rb中,您有has_many :timeslots, :through => availabilities。我猜你想要has_many :users, :through => :availabilites

另一種是在user.rb,你有has_many :timeslots, :through => availabilities,但你需要符號:availabilites。我相信這是造成您發佈錯誤的原因。它應該是這樣的(我的一切改變的是第二個到最後一行):

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

不存在可用性的複數。 – DrevanTonder

+0

嘗試這是在'用戶。rb',你會明白我的意思:'has_many:timeslots,:through =>:availabilities' –

+0

對不起,我以爲你的意思是可用性的複數是availabiltty。我明白你的意思了。 – DrevanTonder

1

我看到你的代碼,一個小小的問題:

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

它應該是:

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

我不知道它是否能夠解決你的問題,但你的代碼(排除上述的錯誤)對我來說聽起來很好。

+0

關聯相關的許多時隙哎呀複製粘貼問題。雖然我仍然得到錯誤。不管怎麼說,還是要謝謝你。 – DrevanTonder

+1

我在這裏看到另一個問題:您應該在'user.rb'和'timeslot.rb'中使用'availabilities'作爲符號(':availabilities')。它應該解決問題。 –

0

爲了設置兩個表userstimeslots之間has_many through關係,你需要設置連接表availabilities的列user_idtimeslot_id

設置您的軌道模型如下圖所示:

# 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 

您需要遷移到創建availabilities表充當連接表,通過Timeslot對象和User對象之間的關係,你的has_many。遷移文件看起來是這樣的:

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

訪問

User.last.timeslots給人0,1或User.last

Timeslot.last.users給人0,1或許多用戶與Timeslot.last