1

我对 Ruby 和 Rails 都还很陌生,我开始着手一个业余项目并制定最佳实践。我想知道解决此问题的推荐方法可能是什么。

我有一组带有用户给出的相关等级的小部件。在视图中显示小部件列表时,我想显示登录用户给出的分数(如果有的话)。

我的工作看起来像这样,但感觉很脏。在我的控制器中,我抓取了一些小部件和相关的成绩(所有成绩都在其他地方使用),并从这些数据中生成了一个 myGrades 哈希:

@widgets = Widget.include(:grades).limit(20)
@myGrades = Hash[@widgets.collect{ |w| [w.id,w.grades.select{ |g| g.user_id==site_user.id}].delete_if{|k,v|v.nil?}]

在我的 haml 视图中,当呈现小部件时,我有这样的东西:

-if @myGrades.has_key?(widget.id) 
  .mygrade @myGrades[widget.id].value

但是,我觉得用“我给这个评分了吗?”之类的方法会更好。并在我的评分小部件上“给我的成绩”,没有 myGrades 中间人。不过,最终会有很多不同的对象被分级,那么我应该如何在 Rails 中最好地实现这些方法,以便它们可以应用于任何分级模型?

4

1 回答 1

1

您可以执行以下操作:

@my_grades = Widget.include(:grades).where(grades: {user_id: site_id}).limit(20)

正如@sameera207 指出的那样,您应该在模型中移动这个复杂的查询:创建一个范围。

class Widget < ActiveRecord::Base

  scope :for_user, lambda do |user, limit = 20| 
    includes(:grades).where(grades: {user_id: user.try(:id) || user}).limit(limit)
  end

并像这样使用它:

Widget.for_user(user_id)
# works also with a user object:
Widget.for_user(user)
# or if you want a custom limit:
Widget.for_user(user_id, 50)
于 2013-10-23T22:57:42.707 回答