2016-01-24 67 views
0

我想弄清楚我有3個模型之間的關聯。Rails 4協會連接

挑戰,SIP用戶

用戶可以創建一個SIP,並且用戶可以提交挑戰是一口。啜飲面臨着許多挑戰

challenge.rb

class Challenge < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :sip, counter_cache: true 
end 

sip.rb

class Sip < ActiveRecord::Base 
    belongs_to :user 
    has_many :challenges 
end 

user.rb

class User < ActiveRecord::Base 
    has_many :challenges 
    has_many :sips 
end 

以下是列:

Challenge: id, user_id, sip_id 
Sip: id, user_id 
User: id 

在我一口觀點,我試圖讓這樣的用戶列表:

- @sip.each do |sip| 
    = sip.challenges.users.to_json 

最後,我想所有具有用戶提交了屬於sip的挑戰。

回答

1

sip.challenges是一個集合,你必須通過它map來獲取用戶。這是怎麼回事,讓你的用戶集合的集合,讓你flatten它,uniq它,compact它來刪除任何nil S:

sip.challenges.map(&:user).flatten.uniq.compact

flatten變成[[1,2], [2,3]][1,2,2,3]uniq輪流到這一點[1,2,3]

map(&:user)發送user在枚舉(集合)每個項目這是對的map左側,在這種情況下,在各challenges挑戰。

這樣高效?呃......留給你做練習。

編輯:添加HTML標籤:盡一切的結果本身就是一個Enumerable,這樣你就可以each了它:

%ul 
    - sip.challenges.map(&:user).flatten.uniq.compact.each do |user| 
    %li= user 
+0

你不需要'flatten'雖然因爲每一個挑戰只有一個用戶。 – Satya

+0

如何將html標籤應用到每個循環? – hellomello