我在我的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 events
。eventhaver_id
= 1 AND {{1 }}。events
='情景'
这告诉我某些东西不适用于多态定义,因为它正在寻找抽象类/模型'eventhaver'而不是子类'Scenario'和'Run'。我还需要做什么才能使Rails建立连接并查找scenario_id或run_id?
答案 0 :(得分:1)
您的eventhaver_id
表格中需要有一个整数列eventhaver_type
和一个字符串列events
。
错误告诉您,至少缺少列eventhaver_id
。
如果您的scenario_id
表格中有结果run_id
和events
,则可以将其删除。多态关联仅使用*abstract*_id
,*abstract*_type
接口。
请参阅:http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
修改的:
如果您无法更改数据库,则可以使用:has_many, :through
加events
方法访问属于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