Ruby on rails 如何创建一个方法来确定用户是否是组的一部分?
我很难创建一个方法来确定用户是否属于某个组。有一个用户、组和成员的模型。下面是两种方法(我尝试了许多方法,但都没有成功) 如何创建一个方法来确定用户是否是组的成员?(我希望该方法产生正确或错误的结果。) 以下是三种不同模型的属性:Ruby on rails 如何创建一个方法来确定用户是否是组的一部分?,ruby-on-rails,methods,associations,model-associations,Ruby On Rails,Methods,Associations,Model Associations,我很难创建一个方法来确定用户是否属于某个组。有一个用户、组和成员的模型。下面是两种方法(我尝试了许多方法,但都没有成功) 如何创建一个方法来确定用户是否是组的成员?(我希望该方法产生正确或错误的结果。) 以下是三种不同模型的属性: create_table "groups", force: :cascade do |t| t.string "name" end create_table "memberships", force: :cascade do |t| t.integer
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
类成员资格
这应该适合您:
def member?(group)
groups.include?(group)
end
这应该适合您:
def member?(group)
groups.include?(group)
end
你现在的会员资格?方法正在返回一个数组。如果你需要,有吗?最后,它将返回true或false
def membership?(group)
Membership.where(user_id: self.id, group_id: group.id).any?
end
编辑:杜蒂的答案是最精确的——把这个留在这里只是为了解释为什么你原来的方法不起作用你现在的会员资格?方法正在返回一个数组。如果你需要,有吗?最后,它将返回true或false
def membership?(group)
Membership.where(user_id: self.id, group_id: group.id).any?
end
编辑:杜蒂的答案是最精确的——把这个留在这里只是为了解释为什么你原来的方法不起作用不是答案,只是说:
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将返回[]
,除非它找到任何数据。因此,[]确实等于true
,这意味着您的true块将始终被调用!如果您想继续使用where逻辑,您需要询问数组是否包含任何数据<代码>[]有吗?
您不需要编写return
,因为ruby总是返回任何内容的最后一个值
//根据您的请求通过注释进行编辑:
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
是的,你可以去。哪里有?但是imagine the.where()将返回一千个数据集,您只需要知道是否只有一个。。。
我们称之为“坏代码”
更好的解决方案是使用find_by。Find_by返回第一个匹配元素。
Membership.find\u by(user\u id:id,group\u id.group\u 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
不是答案,只是说:
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将返回[]
,除非它找到任何数据。因此,[]确实等于true
,这意味着您的true块将始终被调用!如果您想继续使用where逻辑,您需要询问数组是否包含任何数据<代码>[]有吗?
您不需要编写return
,因为ruby总是返回任何内容的最后一个值
//根据您的请求通过注释进行编辑:
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
是的,你可以去。哪里有?但是imagine the.where()将返回一千个数据集,您只需要知道是否只有一个。。。
我们称之为“坏代码”
更好的解决方案是使用find_by。Find_by返回第一个匹配元素。
Membership.find\u by(user\u id:id,group\u id.group\u 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
关于您的问题创建一个方法来确定用户是否是组的成员,这应该可以正常工作
在user.rb
中定义一个实例方法
def membership?(group)
memberships.find_by(group: group).present?
end
对于您的问题创建一个方法来确定用户是否是组的成员,这应该可以正常工作 在
user.rb
中定义一个实例方法
def membership?(group)
memberships.find_by(group: group).present?
end
你可以用两种干净的方法来做这件事。(您可以使用以下一种或两种方式) 1) app/models/user.rb
class User < ActiveRecord::Base
# ...
# ...
def member_of_group?(group)
groups.exists?(group)
end
end
你可以用两种干净的方法来做这件事。(您可以使用以下一种或两种方式) 1) app/models/user.rb
class User < ActiveRecord::Base
# ...
# ...
def member_of_group?(group)
groups.exists?(group)
end
end
哈,我刚才对他说了同样的话:帕,我刚才对他说了同样的话:谢谢你@huan-son的洞察力。我很想知道为什么我的方法返回的是数据,而不是真或假。现在我了解了密码“.any?”谢谢@huan-son的洞察力。我很想知道为什么我的方法返回的是数据,而不是真或假。现在我了解了密码“.any?”谢谢@dhouty!这种方法有效。感谢您抽出时间回答我的问题。谢谢@dhouty!这种方法有效。感谢您抽出时间回答我的问题。