在我的 Redmine 插件中显示 activity 时我没有的列名出错

Error with a column name I don't have when displaying activity in my Redmine plugin

我目前正在开发一个 redmine 插件,我希望在 activity 流中显示使用该插件进行的操作,我还希望能够在对象中进行搜索由我的插件创建。 我非常仔细地遵循了 Alex Bevilacque 的教程。如果您知道我做错了什么,那就太好了!

一切都是关于 "prestations".

我有这个来迁移我的数据库:

class CreatePrestations < ActiveRecord::Migration
  def change
    create_table :prestations do |t|
      t.column :nom, :string, :null => false
      t.column :description, :text
      t.column :project_id, :int, :default => 0
      t.column :author_id, :int, :default => 0, :null => false
      t.timestamps
    end
  end
end

而这个模型:

class Prestation < ActiveRecord::Base
  belongs_to :project
  validates_presence_of :nom

  acts_as_searchable :columns => [ "#{table_name}.nom", "#{table_name}.description"],
                     :scope => preload(:project),
                     :date_column => "created_at"

  acts_as_event :title => Proc.new { |o| "#{l(:label_title_prestation)} ##{o.id} - #{o.nom}"},
                :description => :description,
                :datetime => :updated_at,
                :type => Proc.new { |o| 'prestation-' + (o.new_status ? 'add' : 'edit') },
                :url => Proc.new { |o| {:controller => 'prestations', :action => 'show', :id => o.id, :project_id => o.project} }

  acts_as_activity_provider :scope => preload(:project),
                            :author_key => :author_id,
                            :type => 'prestations',
                            :timestamp => :updated_at,
                            :permission => :activity_presta

end

这是我 init.rb 的开头:

Rails.configuration.to_prepare do
  Redmine::Activity.register :prestations
  Redmine::Search.available_search_types << 'prestations'
end

当我点击 "search" 时,我可以在每个正常的 redmine 字段中搜索,但不是我的 "prestations",当我查看 activity 流时,我有这个:

ActiveRecord::StatementInvalid (SQLite3::SQLException: no such column: projects.id: SELECT "prestations".* FROM "prestations" WHERE (updated_at BETWEEN '2016-05-20' AND '2016-06-19') AND (((projects.id = 1 OR (projects.lft > 1 AND projects.rgt < 2))) AND (projects.status = 1))):
  lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb:81:in `find_events'
  lib/redmine/activity/fetcher.rb:91:in `block (2 levels) in events'
  lib/redmine/activity/fetcher.rb:90:in `each'
  lib/redmine/activity/fetcher.rb:90:in `block in events'
  lib/redmine/activity/fetcher.rb:89:in `each'
  lib/redmine/activity/fetcher.rb:89:in `events'
  app/controllers/activities_controller.rb:56:in `index'
  lib/redmine/sudo_mode.rb:63:in `sudo_mode'

我重置了数据库从头开始了一个新的redmine,我重新加载了服务器并更改了令牌,但没有用。

我真的不明白为什么 1) 我什至无法在我的 "prestations" 中搜索(只要有复选框就好了) 2) Rails 试图寻找 "projects.id" 而我没有要求

非常感谢。

我在 projects.rb 中发现了一些东西:

  def project_condition(with_subprojects)
    cond = "#{Project.table_name}.id = #{id}"
    cond = "(#{cond} OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt}))" if with_subprojects
    cond
  end

我认为尽管 Redmine Knownledgebase 教程是一个很好的介绍,但如果你想制作自己的插件,它真的充满了基础示例。