【问题标题】:Rails - Use a class method from a another class method with one attribute of the second classRails - 使用另一个类方法中的类方法和第二个类的一个属性
【发布时间】:2014-06-12 15:42:06
【问题描述】:

这是我的问题: 我的 User 类中有一个类方法。我从位于我的 Shop 类中的类方法中调用它。

问题是,User类方法需要shop的属性group_id(Group是第三类)。

我的 User 类方法无法正常工作(请参阅 Rails 3 Scope - Find users not in a specific group),因为尽管它应该返回一些东西,但它什么也没返回。

我的代码目前看起来像这样:

class User
#...
    # Retrieve all users not in a specific group
    # example: User.not_in_group(Group.find(5))
    def self.not_in_group(groupid)
        includes(:group_users).where("group_users.group_id != ?", groupid)
    end
end

class Shop

  belongs_to :group
  attr_accessible :group_id

  def self.get_users_not_in_shop_group
    User
      .not_in_group(:group_id)
  end

在我的日志中我得到:

...AND (group_users.group_id != 'group_id') ...

我相信我应该得到类似的东西:

...AND (group_users.group_id != 13) ...

我该怎么办?

【问题讨论】:

    标签: ruby-on-rails scope


    【解决方案1】:

    这里有两个问题。首先,您在 group_id 变量的名称前有一个分号。因此,group_id 不被解析为一个变量,而是一个符号(为清楚起见,您可以将其视为一种字符串)。 其次,您不应该将 get_users_not_in_shop_group 作为类级方法,因为您希望获取不在某个特定商店的商店组中的用户。您需要 Shop 类的一些对象来进行这样的查询。 这是您应该对 Shop 类执行的操作

    class Shop
      def get_users_not_in_shop_group
        User.not_in_group(group_id)
      end
    end
    

    您的查询应该是这样的:

    Shop.find(4).get_users_not_in_shop_group # I assume this shop has group_id attribute set correctly
    

    【讨论】:

    • 我在我的日志中得到了这个:NameError (undefined local variable or method ``group_id' for #<Class:0x007fd1ca0f8db0>)
    • 我将组添加为 Shop 对象查询的参数,例如 @shop.get_users_not_in_shop_group(@group) 并将 def self.get_users_not_in_shop_group 更改为 def self.get_users_not_in_shop_group(group),它工作正常。感谢您的启发!
    • 问题是,我的查询现在看起来更像@group.shops.first_scope(first_scope_params).get_users_not_in_shop_group(@group)。所以无论@group.shops 中的商店是什么,类方法都会发送相同的结果。我觉得有点奇怪。
    • 类方法是不考虑对象返回相同值的方法。这就是为什么应该使用实例级方法。请看本教程:railstips.org/blog/archives/2009/05/11/…
    【解决方案2】:

    正如错误消息所说,group_id 未定义。

    现在,您在 self 上定义 get_users_not_in_shop_group。这意味着该函数将像这样调用:Shop.get_users_not_in_shop_group(在类上,而不是在对象上)。由于您正在对类进行调用 - 它不知道它的 group_id 是什么,因为它不是从数据库中获取的。

    我想这就是你要找的:

    def get_users_not_in_shop_group
      User.not_in_group(group_id)
    end
    

    这样,函数在对象上,而不是在类上。您可以通过执行以下操作来调用它:

    Shop.find(5).get_users_not_in_shop_group
    

    【讨论】:

    • 这个看起来有点像复制品 ;)
    • @twonegatives - 当我写下我的答案时,你只说它看起来像一个错字
    • 啊,我好像在你打字的时候更新了它。乍一看没有意识到类级方法的问题;)
    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多