如何创建方法以确定用户是否属于某个群组?

时间:2015-08-19 18:06:35

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

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

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

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

5 个答案:

答案 0 :(得分:2)

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

user.rb中定义实例方法

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

答案 1 :(得分:1)

这应该适合你:

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

答案 2 :(得分:0)

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

def membership?(group)
  Membership.where(user_id: self.id, group_id: group.id).any?
end
编辑:dhouty的答案是最精确的 - 留在这里只是为了解释为什么你的原始方法不起作用

答案 3 :(得分:0)

不是答案,只是说:

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,这意味着 - 你的真正块将永远被调用!如果您想坚持使用逻辑,那么您需要询问数组是否包含任何数据。 [].any?

你不需要写return因为ruby总是返回任何内容的最后一个值。

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

你可以去.where()。任何?但是图像.where()将返回一千个数据集,你只需要知道是否只有一个...... 我们称之为“错误代码”#34;

更好的解决方案是使用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

答案 4 :(得分:0)

你可以用两种干净的方式做到这一点。 (您可以使用以下任一项或两者)

1)app / models / user.rb

my_dict = {'AAAGGG': ['AGAGAGAA', 'AGAGAGAG'], 'AAAGGC': ['AGAGAGAG']})

for parent_value in my_dict.values():
    for sub_value in parent_value:
        for char in sub_value:
            do_something(char)

2)app / models / groups.rb

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

然后您可以使用以下方法:

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