【问题标题】:How do I create a method to find out if a user is part of a group?如何创建一种方法来确定用户是否属于组?
【发布时间】:2015-11-13 04:07:43
【问题描述】:

我很难创建一种方法来确定用户是否属于某个组。有一个用户、组和成员的模型。以下是两种方法(我尝试过的许多方法,但都没有成功)。

如何创建一种方法来确定用户是否是组的成员?(我希望该方法产生真假结果。)

def member?(group_1)
  if Membership.where(user_id: self.id, group_id: group_1.id)
    return true
  else 
    return false
  end
end

def membership?(group)
  Membership.where(user_id: self.id, group_id: group.id)
end

以下是三种不同模型的属性:

create_table "groups", force: :cascade do |t|
  t.string   "name"
end

create_table "memberships", force: :cascade do |t|
  t.integer  "user_id"
  t.integer  "group_id"
end

create_table "users", force: :cascade do |t|
  t.string   "email"
  t.string   "first_name"
  t.string   "last_name"
end

以下是各个模型中的代码:

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

class User < ActiveRecord::Base
  has_many :memberships, dependent: :destroy
  has_many :groups, through: :memberships
end

class Group < ActiveRecord::Base
  has_many :memberships, dependent: :destroy
  has_many :users, through: :memberships
end

【问题讨论】:

    标签: ruby-on-rails methods associations model-associations


    【解决方案1】:

    关于你的问题创建一个方法来确定用户是否是组的成员,这应该可以正常工作

    user.rb中定义一个实例方法

    def membership?(group)
      memberships.find_by(group: group).present?
    end
    

    【讨论】:

      【解决方案2】:

      这应该适合你:

      def member?(group)
        groups.include?(group)
      end
      

      【讨论】:

      • 谢谢@dhouty!这种方法有效。感谢您抽出宝贵时间回答我的问题。
      【解决方案3】:

      您目前的会员资格?方法返回一个数组。如果你附加 .any?到最后,它会返回真或假。

      def membership?(group)
        Membership.where(user_id: self.id, group_id: group.id).any?
      end
      

      编辑:dhouty 的回答是最准确的 - 在这里留下这个只是为了解释为什么你的原始方法不起作用

      【讨论】:

      • 哈,我刚刚对他说了类似的话:P
      【解决方案4】:

      您可以通过两种干净的方式来做到这一点。 (您可以使用以下方法之一或两者都使用)

      1) app/models/user.rb

      class User < ActiveRecord::Base
        # ...
        # ...
        def member_of_group?(group)
          groups.exists?(group)
        end
      end
      

      2) app/models/groups.rb

      class Group < ActiveRecord::Base
        # ...
        # ...
        def has_user_member?(user)
          users.exists?(user)
        end
      end
      

      那么你可以使用如下方法:

      # If checking if a User object is member of a @group
      @user.member_of_group?(@group)
      => returns true or false
      
      # If checking if a Group object has a member @user
      @group.has_user_member?(@user)
      => returns true or false
      

      【讨论】:

        【解决方案5】:

        不是答案,只是说:

        def member?(group_1)
          if Membership.where(user_id: self.id, group_id: group_1.id)
            return true
          else 
            return false
          end
        end
        

        Membership.where 将 return [] 除非它找到任何数据。为此,[] does equal true,这意味着 - 您的真正块将始终被调用!如果你想坚持 where 逻辑,你需要询问数组是否包含任何数据。 [].any?

        你不需要写return,因为 ruby​​ 总是返回任何东西的最后一个值。

        // 通过评论修改您的请求:

        是的,你可以去 .where().any 吗?但是想象一下 .where() 将返回一千个数据集,您只需要知道是否只有一个... 我们称之为“坏代码”。

        更好的解决方案是使用 find_by。 Find_by 返回第一个匹配元素。 Membership.find_by(user_id: id, group_id. group_1.id)

        find_by 的好处在于,如果没有找到,它将返回 nil。这意味着你可以做到这一点

        def member?(group_1)
            !!Membership.find_by(user_id: id, group_id: group_1.id)
        end
        

        Find_by 将返回 nil 或对象,使用 !! 将对象变为 true 的表达式

        【讨论】:

        • 感谢@huan son 的洞察力。我很想知道为什么我的方法返回数据而不是真假。现在我了解了代码“.any?”
        猜你喜欢
        • 2020-10-24
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 2015-08-02
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 2011-03-05
        相关资源
        最近更新 更多