Rails多态 - Action Controller的异常

时间:2015-10-27 20:38:11

标签: ruby-on-rails ruby-on-rails-4

我在我的Rails模型之间实现多态性时遇到了麻烦。

预期的结构是我有一个名为'Test'的对象/模型。每个测试都有多个场景和多个运行。每个场景和每个运行都有多个事件。在测试的“显示”视图中,我希望列出与之相关的所有事件(通过场景/运行)。

我所拥有的课程定义:

class Test < ActiveRecord::Base
    has_many :scenarios
    has_many :runs
end

class Scenario < ActiveRecord::Base
    belongs_to :test
    has_many :events, :as => :eventhaver
end

class Run < ActiveRecord::Base
    belongs_to :test
    has_many :events, :as => :eventhaver
end

class Event < ActiveRecord::Base
    belongs_to :eventhaver, :polymorphic => true
end

数据库已完全设置并包含一系列记录 - 1个带有4个场景的测试和2个运行,每个都有1或2个事件。但是当我尝试去测试的show视图时:

ActiveRecord :: StatementInvalid in Tests#show
Mysql2 ::错误:'where子句'中的未知列'events.eventhaver_id':SELECT events。* FROM events WHERE eventseventhaver_id = 1 AND {{1 }}。events ='情景'

这告诉我某些东西不适用于多态定义,因为它正在寻找抽象类/模型'eventhaver'而不是子类'Scenario'和'Run'。我还需要做什么才能使Rails建立连接并查找scenario_id或run_id?

1 个答案:

答案 0 :(得分:1)

您的eventhaver_id表格中需要有一个整数列eventhaver_type和一个字符串列events

错误告诉您,至少缺少列eventhaver_id

如果您的scenario_id表格中有结果run_idevents,则可以将其删除。多态关联仅使用*abstract*_id*abstract*_type接口。

请参阅:http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

修改的: 如果您无法更改数据库,则可以使用:has_many, :throughevents方法访问属于event的所有test

class Test < ActiveRecord::Base
  has_many :scenarios
  has_many :runs
  has_many :scenario_events, through: :scenarios, source: :events
  has_many :run_events, through: :runs, source: :events

  def events
    scenario_events + run_events
  end 
end


class Scenario < ActiveRecord::Base
  belongs_to :test
  has_many :events
end


class Run < ActiveRecord::Base
  belongs_to :test
  has_many :events
end


class Event < ActiveRecord::Base
  belongs_to :run
  belongs_to :scenario
end