【问题标题】:Rails 4 - find entity through many to many attributeRails 4 - 通过多对多属性查找实体
【发布时间】:2014-07-01 15:47:42
【问题描述】:

我的 Rails 应用程序中有三个模型对象,UserMemberTeam,其中Member 是我的联接表。一些成员对象可以是特定团队的管理员,因此在我的 Member 模型中,我有一个 admin bool 属性。在我的某些观点中,我想检查current_user 是否是任何特定团队的管理员。

我的相关团队模型如下所示:

has_many :members, after_add: :set_admin
has_many :users, through: :members
has_many :admins, -> { where("admin = 1") }, through: :members, source: :user

def set_admin

  self.members.first.admin = true

end

我希望创建团队的用户成为管理员,因此我的 set_admin 方法。让我知道是否有更好的方法来做到这一点。

在我看来,我想做一些类似 (HAML) 的事情:

- if @team.admins.include?(current_user)
    ...

但这不起作用。我不太确定是不是因为 admin 属性没有设置。或者如果还有其他问题,我不确定 .include?(current_user) 是否有效。

知道我能做什么吗?

更新

这就是我创建用户和团队的方式。在我的UsersController 我有:

# GET /users/new
def new
  @user = User.new
  @team = @user.teams.build
end

在我的用户模型中,我有:

accepts_nested_attributes_for :teams

当用户注册时,我还会创建团队。

【问题讨论】:

  • 是您的Team 还是您的User 型号?
  • 哦,这是我的团队模型。

标签: ruby-on-rails ruby-on-rails-4 many-to-many jointable


【解决方案1】:

Member 定义

class Member
  belongs_to :user
  belongs_to :team

  def self.admin
    where(:admin => 1)
  end
end

那你就可以写了

@team.members.admin

这将为您提供所有管理员成员(而非用户)的列表。

然后,您可以在Team上添加以下方法

def is_admin(user)
  self.members.admin.where(:user_id => user.id).count == 1
end

[UPDATE] 您确实设置了管理员标志,但从未保存。所以你的方法应该像

def set_admin
  if self.members.admin.count == 0
    self.members.first.update_atributes admin: 1
  end
end

我还测试是否已经有管理员,如果没有,则仅设置它。否则,每次添加成员时,您都会将第一个成员设置为 admin。但有可能这就是你想要的。

UI/UX 方面,我不希望随机成员成为管理员,而是团队创建者必须在创建团队后立即分配团队管理员。

[更新 2] 您在 team 的关联 members 上定义了 set_admin 方法,但您没有使用该关系来构建成员,因此永远不会触发该方法. 您可以通过添加日志方法轻松验证这一点。

您创建了一个具有新团队的用户,因此您可以在 teams 关联上添加一个方法。但这对我来说似乎有点多余:您知道要添加哪个团队,以及哪个用户。

在您的控制器中,您将拥有类似(只是猜测)的东西

user.save

这将创建用户和嵌套团队,并根据定义创建介于两者之间的成员。我会选择明确的方法。

选项1:保存后添加这一行

user.members.last.update_attributes admin: true

因为最后添加的成员关系是刚刚创建的。不过这感觉有点脏。

选项2:保存后,添加这一行

user.teams.last.set_admin

这读起来好一点。然后你可以删除after_add: :set_admin 选项,因为管理员标志在创建时设置正确,并且在添加新成员时不需要。

【讨论】:

  • 谢谢,我试过你的方法。应该管用。但我的 admin 属性似乎并没有被设置为 true 鄙视这一点:has_many :members, after_add: :set_admin。任何想法为什么会发生这种情况,或者我应该如何设置该属性?当用户创建团队时,我希望该用户的 admin 设置为 yes...
  • 我确实忽略了这一点,我扩展了我的答案。
  • 谢谢!我现在也试过了,但似乎没有帮助。在我看来,我现在使用:- if @team.is_admin(current_user),但这永远不会设置为 true。还有什么想法吗?
  • 检查数据库?设置好了吗?
  • 不,在 Rails 控制台中是 nil。
猜你喜欢
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多