我正在尝试找出我拥有的 3 个模型之间的关联。
挑战, 啜饮, 用户
用户可以创建 Sip,用户可以向该 Sip 提交挑战;啜饮有很多挑战
挑战.rb
class Challenge < ActiveRecord::Base
belongs_to :user
belongs_to :sip, counter_cache: true
end
啜啜啦��
class Sip < ActiveRecord::Base
belongs_to :user
has_many :challenges
end
用户.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 视图中,我试图获取这样的用户列表:
- @sip.each do |sip|
= sip.challenges.users.to_json
最终,我想让所有提交挑战的用户都属于sip
。
sip.challenges
是一个集合,你必须map
它才能获得用户。这将为你提供用户集合,因此您可以flatten
它,uniq
它,并compact
它以删除任何nil
:
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