zoukankan      html  css  js  c++  java
  • IssueQuery failed in redmine rake tasks

    背景

    近期为了修改系统中issue数据字段,没有插件直接支持,准备采用rake任务来完成。

    错误代码

    query = IssueQuery.new(:project => project)
    query.add_filter('tracker_id', '=', [tracker_deliver.id.to_s]) #tracker_deliver和icf_src在前面已有定义
    query.add_filter("status_id", "=", ["2"])
    query.add_filter("cf_#{icf_src.id}", ">=", ["1"])
    # 上面所有操作都成功
    issues = find_issues_with_query(query) # 执行后发现,该project下所有issues全部选出来了,filters没有起作用。

    设置断点调试后发现,在Query:statement函数里有以下代码:

    filters.each_key do |field|
    next if field == "subproject_id"
    v = values_for(field).clone
    next unless v and !v.empty?
    operator = operator_for(field)
    ........ # 这里根据filter内容生成sql语句
    end if filters and valid? # 这里valid返回了false,因此没有生成filter对应的sql。

    valid为ActiveRecord的方法,生成context进行验证,这里验证会失败。

    解决

    1、看了网上rake任务代码,多半采用执行sql语句的方式完成。 测试执行sql语句可以,如下:

    scope = Issue.joins(:status).where("#{Issue.table_name}.project_id IN ('4')" +
    "AND #{Issue.table_name}.tracker_id IN ('4')"
    )
    issues = scope.includes(:status, :project, :tracker).all

    2、修改statement方法,不进行valid验证。 感觉该方法有安全隐患,可能造成冲突。

    3、采用get方法,获取issues列表。(未测试)

    参考:

    1、rake实例代码

    2、rake实例代码2

    open_issue_status_ids = IssueStatus.select('id').where(is_closed: false).collect { |is| is.id}

    ssues Issue.where(['tracker_id = ? AND assigned_to_id IS NOT NULL AND status_id IN (?) AND (updated_on < ?)',t.id, open_issue_status_ids, updated_since])

    3、将任务转换为web形式

    4、sql教程sql教程2

  • 相关阅读:
    js正则表达语法
    Codeforces 976E/925C (01Trie树)
    ZOJ 3879(大模拟)
    CF967C(二分+细节)
    CF967A(细节模拟)
    HDU 2222(AC自动机模板)
    HDU 5510(KMP+思维)
    HDU 6273(树状数组+思维)
    HDU 6266(思维+规律)
    HDU 6264(思维)
  • 原文地址:https://www.cnblogs.com/lustforlife/p/6432118.html
Copyright © 2011-2022 走看看