2

我刚刚在这里的一位朋友提到了 stackoverflow,以帮助解决我遇到的问题。我对 ruby​​ on rails 相当陌生,我正在开展一个协作项目,我们有一个脚本 (medal_worker.rb),该脚本计划以固定的时间间隔运行,根据我们网站上的各种参与和成功向人们授予各种奖牌。我正在制作的新奖章之一是奖励“里程碑”的人。对于这个问题,假设我们想在他们发表 100、1000 和 10000 条评论时给他们奖牌。我想通过使用用户模型(user.rb)中的 named_scopes 来为我提供我正在寻找的用户的过滤列表来做到这一点。

我的问题是:如何找到没有相应里程碑评论级别的相应奖牌的用户(最好使用用户模型中的 named_scopes)?

这是我的 model_worker.rb 文件的摘录:

def award_comment_milestone(comments)
   users = Users.frequent_comment_club_members(comments).not_awarded_medal(Medal.find_by_id(medal.id))
   for user in users do
      award_medal(medal, nil, user) if @award
   end
end

这是我在用户模型(user.rb)中使用 named_scopes 的位置:

named_scope :frequent_comment_club_members, lambda { |*args|
        {:include => comment_records, :conditions => ['comment_records.comment_type = ? and comment_records.comments >= ?', 'User', (args.first || 0)]}
}

named_scope :not_awarded_medal, lambda { |medal|
    {:include => :awards, :conditions => ['awards.medal_id not in (select awards.medal_id from awards where awards.medal_id = ?)", medal.id] }
}

这不像我想的那样工作,但我不知道问题是否出在 named_scopes 或我如何传递争论或什么。谢谢。

4

1 回答 1

1

你的named_scopes样子很好。not_awarded_medal除非您在条件语句中以单撇号开头并以双撇号结尾。

编辑

把它收回。您的not_awarded_medalnamed_scope 已关闭。

尝试这样的事情:

named_scope :not_awarded_medal, lambda { |medal_id|
  { :include => :awards,
    :conditions => [
      "? not in (select awards.id from awards where awards.user_id = users.id)", medal_id
    ]
  }
}

未经测试

现在这是假设您具有以下关系:

User: has_many :awards Award: belongs_to :user

如果您正在使用,has_many :through那么您将不得不更改 SQL 以查看连接 (users_awards) 表。

--

award_comment_milestone但我确实在函数中看到了一些东西。

参数是award_comment_milestone什么?是评论数组还是评论数?还有在哪里medal定义?

如果comments是一个数组,那么你需要comments.length传入frequent_comment_club_members. 如果是计数,那么我会将其重命名为,comments_count以便下一个人可以更快地理解逻辑。

一些一般性意见:

  • not_awarded_medal应该只取一个 Medal_id 而不是整个对象(无需进行多次查询)
  • 你为什么要这样做Medal.find_by_id(medal.id)?您已经拥有奖牌对象。
于 2010-04-20T19:33:35.160 回答