首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4关联连接

Rails 4关联连接
EN

Stack Overflow用户
提问于 2016-01-24 22:34:50
回答 1查看 25关注 0票数 0

我想找出我有三个模特之间的联系。

挑战,Sip,用户

用户可以创建Sip,用户可以向该Sip提交挑战;Sips有许多挑战。

challenge.rb

代码语言:javascript
复制
class Challenge < ActiveRecord::Base
  belongs_to :user
  belongs_to :sip, counter_cache: true
end

sip.rb

代码语言:javascript
复制
class Sip < ActiveRecord::Base
  belongs_to :user
  has_many :challenges
end

user.rb

代码语言:javascript
复制
class User < ActiveRecord::Base
  has_many :challenges
  has_many :sips
end

以下是专栏:

代码语言:javascript
复制
Challenge: id, user_id, sip_id
Sip: id, user_id
User: id

在我的sip视图中,我试图获得这样的用户列表:

代码语言:javascript
复制
- @sip.each do |sip|
  = sip.challenges.users.to_json

最终,我希望得到所有提交了属于sip的挑战的用户。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-24 22:55:38

sip.challenges是一个集合,您必须通过map来获取用户。这将为您提供一组用户集合,因此您可以对其进行flatten,并对其进行uniq,并将其用于删除任何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

代码语言:javascript
复制
%ul
  - sip.challenges.map(&:user).flatten.uniq.compact.each do |user|
    %li= user
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34982376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档