Rails遍历对象数组

时间:2014-03-06 10:15:02

标签: ruby-on-rails

我想做这样的事情

@groups = Community::GroupMember.where(:member_id => current_user.id)
      user_ids = []
      @groups.each do |group|
        user_ids << @group.community_group_members.where(:group_id =>    group.id).pluck(:member_id)
      end

但是我得到错误NoMethodError - 未定义的方法`community_group_members'我想我不是按照我想要的方式正确迭代@groups。

3 个答案:

答案 0 :(得分:2)

你应该:

user_ids << group.community_group_members.pluck(:member_id)

group代替@group)。这是因为在each块内部,数组的元素由局部变量(没有前缀)而不是实例变量(前缀为@)表示。因此,@group实例变量未设置,因此评估为nil,它不响应community_group_members方法。

此外,我删除了您的where条款,因为它是还原剂 - 您已经在group.community_group_members调用中执行此操作。

答案 1 :(得分:0)

@groups = Community::GroupMember.where(:member_id => current_user.id)
      user_ids = []
      @groups.each do |group|
        user_ids << group.community_group_members.where(:group_id =>    group.id).pluck(:member_id)
      end

使用块变量组而不是@group工作吗?

答案 2 :(得分:0)

假设您有两个模型Community::GroupCommunity::GroupMember分别带有关联has_many :community_group_membersbelongs_to :community_group,那么您的第一行:

@groups = Community::GroupMember.where(:member_id => current_user.id)

返回Community::GroupMember个实例的数组,即组成员,而不是组。

要获取关联的群组,您可以使用map

@group_members = Community::GroupMember.where(member_id: current_user.id)
@groups = @group_members.map { |group_member| group_member.community_group }

join

@groups = Community::Group.joins(:community_group_members).where(community_group_members: { member_id: current_user.id })

您现在可以使用

检索member_id
user_ids = Community::GroupMember.where(group_id: @groups).pluck(:member_id)