【问题标题】:Ruby on Rails: using nested named_scopesRuby on Rails:使用嵌套的 named_scopes
【发布时间】:2010-04-20 19:09:21
【问题描述】:

我刚刚在这里的一位朋友提到了 stackoverflow,以帮助解决我遇到的问题。我对 ruby​​ on rails 相当陌生,我正在开展一个协作项目,我们有一个脚本 (medal_worker.rb),该脚本计划以固定的时间间隔运行,根据我们网站上的各种参与和成功向人们授予各种奖牌。我正在制作的新奖章之一是奖励“里程碑”的人。对于这个问题,假设我们想在他们完成 100、1000 和 10000 cmets 时给他们奖牌。我想通过使用来自用户模型 (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 中,或者我如何传递争论或什么。谢谢。

【问题讨论】:

    标签: ruby-on-rails nested named-scope


    【解决方案1】:

    您的named_scopes 看起来不错。除非您在 not_awarded_medal 条件语句中以单撇号开头并以双撇号结尾。

    编辑

    把它拿回来。您的 not_awarded_medal named_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 的参数是什么?它是 cmets 数组还是 cmets 计数? medal 在哪里定义?

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

    一些一般性观察:

    • not_awarded_medal 应该只取一个 Medal_id 而不是整个对象(无需进行多次查询)
    • 你为什么要Medal.find_by_id(medal.id)?您已经拥有奖牌对象。

    【讨论】:

    • 感谢您的快速反馈。单引号与双引号可能是我在这里输入代码的方式,但很好的观察。关于传递给award_comment_milestone的参数,我没有指定,但是每次传入三个值(100、1000、10000)之一以检查不同的里程碑时,此函数会被调用三次。假设传入 100,我想找出拥有超过 100 个 cmets,但尚未获得此里程碑奖章的用户数(1000 和 10000 相同)。也许将其称为 comment_count 或 comment_milestone vs. cmets 是个好主意。
    • 查看我的编辑。我认为您对not_awarded_medal named_scope 有疑问
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多