【问题标题】:Rails 4 - method to count a user's projectsRails 4 - 计算用户项目的方法
【发布时间】:2016-08-15 23:09:33
【问题描述】:

我正在尝试学习如何编写一个方法来计算我的 Rails 4 应用程序中的用户项目。

我有名为 Project 和 Profile 的模型。这些关联是:

项目

belongs_to :profile

简介

has_many :projects

在我的项目模型中,我有一个按 profile_id 查找项目的范围。

scope :by_profile, ->(profile_id) { where(profile_id: profile_id) }

现在,我正在尝试编写方法来计算配置文件已进行了多少项目。

def project_counter
    # projects created by this project creator
    self.by_profile.count 

    # plus all the projects where the user is part of a project team


  end

当我保存它并尝试在视图中使用它时:

<%= @project.project_counter %>

我收到一条错误消息:

undefined method `by_profile' for #<Project:0x007f98f1dff278>
Did you mean?  profile

谁能看到我做错了什么?

【问题讨论】:

  • 你打电话给self.by_profile.count 没有通过profile_id 试试self.by_profile(&lt;user id here&gt;.count
  • 我想统计属于用户个人资料的项目数。我真的应该为此添加 user_id 吗?用户与项目没有直接关联。我正在尝试计算项目表中的 profile_ids。
  • “在我的项目模型中,我有一个按 profile_id 查找项目的范围。”你不应该需要那个......这就是协会给你的。如果您想知道给定配置文件的项目数量,请执行以下操作:Profile.find(profile_id).projects.count
  • @TarynEast - 我不知道如何从项目视图中启动它。无论如何感谢您的建议。我找到了一种行之有效的方法,现在就足够了。
  • 我不确定我是否理解您所说的“从视图中启动它”是什么意思?您只需复制上面的代码,它应该可以正常工作...?是否在项目视图中并不重要

标签: ruby-on-rails methods count counter


【解决方案1】:

当您调用&lt;%= @project.project_counter %&gt; 时,@project 是在方法内部引用self 的上下文。请注意self 是实例而不是类Project

因此,在方法内部,当您调用self.by_profile 时,您所做的是在实例上调用by_profile。但是by_profile 仅适用于类 Project 而不是实例。这就是为什么你会得到一个undefined methodby_profile',因为#. Here#` 是指实例(由内存位置指向)。

还请注意,您没有将 profile_id 传递给 by_profile,但 ruby​​ 不会抱怨因为它在寻找实例方法 by_profile 而不是类方法 by_profile。(范围实际上添加一个类方法)

如果你想统计一个用户(个人资料的)项目,为什么不使用@project.user.projects.count

希望有帮助!

【讨论】:

  • 嗨阿伦。这就说得通了。我认为 self 是指表而不是实例。我没有意识到调用 @project 会覆盖 self 的值(作为类)以将其限制在表中。不计算 user.projects.count 的原因是我试图在项目页面上显示配置文件创建的其他项目数量。如果按照您显示的方式进行操作,我不确定是否会计算项目创建者的数量 - 我可能会获取当前用户的个人资料的项目。
  • @Mel 我不明白。您想在 projects#show 页面上显示配置文件的项目数(不包括当前项目)吗?像See 20 other projects by Anon 这样的东西?这是你想要的吗?
  • 我想在项目页面显示配置文件的项目数量(包括这个项目)。
  • 我可以用 project.profile.projects.count 试试你的想法
  • 这是我给你的想法的一个变体,你使用project.profile而不是使用Profile.find.projects.count 部分是相关部分 - 而不是滚动您自己的计数代码。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多