Ruby数组包括?方法奇怪的行为

时间:2013-10-07 21:21:01

标签: ruby-on-rails ruby arrays

我正在使用cancan gem,而在ability.rb中,我想检查具有某个角色的用户是否可以更新另一个对象,当且仅当用户'是另一个对象的一部分时(即,模型之间存在关联,用户可以在对象的users方法中找到。

我想使用include?方法查看在生成的@current_user数组中是否找到了User

通过ability.rb测试代码时,它始终返回false。如果我在rails控制台中运行相同的代码,它可以正常工作。

我发现如果include?对象与传递的对象不是同一个类,Array不起作用,但是我通过class.name打印了它们的类,它们是相同。

我最终使用detect并比较了ID,但我想知道以前是否有人遇到过此类问题,如果你能对此有所了解。

delete_if发生了类似的事情,在删除了100中的20之后,计数仍然返回100,但是每个循环只打印了应该在那里的那些(20)。这在RoR环境中执行时发生,但具有相同代码的rails控制台的行为与预期相同(array.count # => 20)。

编辑20131007

关于include?问题的一些代码。 此位始终返回false,即使用户在course.institution.users的结果数组中,也是。

    can [:read, :update], Course do |course|
      val = course.institution.users.include? user
    end

如果我采用相同的行,并在rails控制台中为给定的课程和用户尝试,如下所示:

    Course.find(course_id).institution.users.include? User.find(user_id)

它按预期工作,返回true然后在数组中找到用户,如果没有,则false

所以即使甚至如果==运算符在某种程度上对于这个特定的模型是奇怪的,我在两种情况下都处理相同的数组,所以它应该是破坏或在两个案例中都能很好地工作,不仅仅是在康卡中ability.rb ......对吗?

1 个答案:

答案 0 :(得分:1)

Cancan具有查询关联的内置机制。如果不知道您的确切设置,这应该与您在Ability课程中设置的方式非常接近:

can :view, MyObject, users: { id: user.id }