我很难创建一种方法来确定用户是否属于某个群组。有一个用户,组和成员的模型。以下是两种方法(我试过的很多方法但没有成功)。
如何创建一个方法来确定用户是否是某个组的成员?(我希望该方法产生真或假的结果。)
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
答案 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