0

我正在使用Devise的用戶。多個t.references得到無嵌套模型

User.rb

belongs_to shop 
has_many tasks 

Show.rb

has_many users 
has_many tasks 

Task.rb

belongs_to user 
belongs_to shop 

當我創建一個新的任務:

current_user.tasks.create(...) 

shop_id得到零值,當我需要相同shop_id的用戶。

當我創建一個新的任務

current_user.shop.tasks.create(...) 

我得到的USER_ID作爲零,但得到的shop_id正確的價值。

我在想什麼?

在此先感謝。

+0

您是否嘗試在'rails console'中運行? – 7urkm3n

+0

是,相同的結果。 –

+0

你可以試試這個'User.first.tasks.create(...)'? – 7urkm3n

回答

0

current_user.tasks.create(...) 

運行軌道協會不知道它有人口shop_id除非你明確地把它

current_user.tasks.create(shop_id: current_user.shop.id) 

一樣相反。您可以在用戶,商店和任務之間使用多態關聯的情況下使用更好的建模。更多細節和例子可以在這裏找到。

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

不要以爲這是制定相關。

0

current_user.shop.tasks.create(...)你打電話create直接在tasks集合爲單數shop。這實際上相當於:

Shop.find_by(user_id: current_user.id).tasks.create(...) 

商店都不可能有一個以上的用戶,所以沒有什麼明確的在聲明中表示,新創建的任務應該屬於current_user

我認爲最簡單的辦法是自己創建的任務,明確設置兩個外鍵:

Task.create(shop_id: current_user.shop_id, user_id: current_user.id) 

雖然你不得不重裝你的usershop引用拿起新關聯task

如果你想要更多的東西自動,可以考慮使用關聯回調上has_many :tasks內,其中shop_idTaskuser的shop_id設置用戶:用戶

class user < ActiveRecord::Base 
    belongs_to :shop 
    has_many :tasks, before_add: :assign_to_shop 

    def assign_to_shop(task) 
    task.shop = self.shop 
    ... 
    end 
end 
0

設計current_user方法返回相同的對象。

# simple example 
    def sign_in 
    session[:current_user] = User.find_by_email(params[:email]) 
    end 

    def current_user 
    session[:current_user] 
    end 

如果用戶登錄,然後current_user方法應該工作,像在正下方。

#1 
current_user.tasks.create(...) 

#2 you can also like this 
t = Task.new(...) 
t.user_id = current_user.id 
t.save 

你可以玩rails console,容易理解它。

current_user = User.first 
current_user.tasks.create(...) 
+0

我什麼也沒有改變,這隻在控制檯上工作,不知何故停止。我知道這聽起來很瘋狂,但那就對了! –

+0

@ KamalG'ool你登錄了嗎? – 7urkm3n

+0

我做過了,我在控制器中解決了這個問題,每次創建時,根據current_user分配商店和用戶,稍後我會發布答案。 –