Rails 5搜索具有多对多关系的ActiveRecords以匹配字段

时间:2017-02-28 17:31:19

标签: ruby-on-rails activerecord

我有两个模型,通过另一个模型定义了多对多关系。在这种情况下,用户属于许多组。每个组可以有很多用户。 这种关系是通过会员制模式定义的,会员制模式也具有会员资格,即

user.rb

class User < ApplicationRecord
  has_many :memberships
  has_many :groups, through: :memberships
end

group.rb

class Group < ApplicationRecord
  has_many :memberships
  has_many :users, through: :memberships
end

membership.rb

class Membership < ApplicationRecord
  belongs_to :user
  belongs_to :group

  enum status: [ :non_member, :pending, :member ]
end

当我创建一个新组时,它总是为创建它的用户创建一个成员资格。其他用户以后会为组创建成员资格。

在我的一个视图中,我想显示当前用户所属的所有组。所以我可以这样做:

<% @user.groups.each do |group| %>
   <p><%= group.name %>
<% end %>

然后,我想要显示用户不属于的所有组,以便他们可以请求加入。我尝试了这个,但它返回所有记录,即使我的用户是一个组的成员。

<% Group.joins(:users).where.not(:users => { :id => current_user.id }).each do |group| %>

有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

class User < ApplicationRecord

   has_many :memberships
   has_many :groups, through: :memberships


   def unjoined_groups
      Group.where.not(id: group_ids)
   end

   def unjoined_groups_by_membership_status(status)
      Group.includes(:memberships)
        .where.not(id: group_ids)
        .where(memberships: { status: status })
   end

end

Try this instead...