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!这种方法有效。感谢您抽出时间回答我的问题。