Rails 4个关联连接
Rails 4 association connection
我正在尝试找出我拥有的 3 个模型之间的关联。
挑战、SIP、用户
用户可以创建一个Sip,用户可以向该Sip提交挑战; Sips 有很多挑战
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 视图中,我正在尝试获取这样的用户列表:
- @sip.each do |sip|
= sip.challenges.users.to_json
最后,我想得到所有提交了属于sip
的挑战的用户。
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
我正在尝试找出我拥有的 3 个模型之间的关联。
挑战、SIP、用户
用户可以创建一个Sip,用户可以向该Sip提交挑战; Sips 有很多挑战
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 视图中,我正在尝试获取这样的用户列表:
- @sip.each do |sip|
= sip.challenges.users.to_json
最后,我想得到所有提交了属于sip
的挑战的用户。
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