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 它以删除任何 nils:

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