Ruby on rails 多表继承,无法从子类访问列
更新:Ruby on rails 多表继承,无法从子类访问列,ruby-on-rails,ruby,ruby-on-rails-3,multi-table-inheritance,Ruby On Rails,Ruby,Ruby On Rails 3,Multi Table Inheritance,更新: 将table_name更改为self.table_name=似乎说服了rails使用正确的表 然而,我现在发现了这些奇怪的错误 Mysql2::Error: Unknown column 'templates.deleted_at' in 'where clause': SELECT `objekts`.* FROM `objekts` WHERE (`templates`.`deleted_at` IS NULL) 原始问题: 我有一个模板和一个对象: class Templ
将table_name更改为self.table_name=似乎说服了rails使用正确的表 然而,我现在发现了这些奇怪的错误
Mysql2::Error: Unknown column 'templates.deleted_at' in 'where clause': SELECT `objekts`.* FROM `objekts` WHERE (`templates`.`deleted_at` IS NULL)
原始问题:
我有一个模板和一个对象:
class Template < ActiveRecord::Base
def status; 0; end # Template doesn't have a status column, so define default
end
class Objekt < Template
table_name = "objekts" # there is a status column in this table
end
类模板
但是当我在控制台中执行时,Objekt.new.attributes
,它只列出Template
对象中的属性,而不列出任何Objekt
模板
上的每一列也可在Objekt
中找到,但是Objekt
有额外的10列(大部分是标志)
这是怎么回事?为什么rails不将
Objekt
类连接到objekts
表?参考上面的注释,当我提到组合而不是继承时,我正在考虑这样的事情
class Objekt < ActiveRecord::Base
include Template
def status
self.random_column_name || super
end
end
module Template
def status
0
end
end
class-Objekt
参考上面的评论,当我提到组合而不是继承时,我想到了这样的事情
class Objekt < ActiveRecord::Base
include Template
def status
self.random_column_name || super
end
end
module Template
def status
0
end
end
class-Objekt
一个有很多/属于的关系在这里不是比使用模板方法模式更好吗?在本例中,模板更像是一个基本类Objekt
应与表相关。约定优先于配置。好吧,模板有很多方法,Objekt也应该有。这就是为什么我认为继承是最好的例子。Mayble表继承根本不是正确的术语。我希望两个对象都有完全独立的表。。碰巧这些表共享一些列名。大多数情况下,我想在两者之间分享方法。模块不能工作,因为它会覆盖Objekt的列定义(或者会覆盖)。我更喜欢遵循组合而不是继承的模式。您能否将这些方法从模板中移到一个模块中,并根据需要在Objekt中包含/扩展它们?然后它们都可以从ActiveRecord::Base
继承has\u many/allown\u to
关系是否比使用模板方法模式更好?在本例中,模板更像是一个基本类Objekt
应与表相关。约定优先于配置。好吧,模板有很多方法,Objekt也应该有。这就是为什么我认为继承是最好的例子。Mayble表继承根本不是正确的术语。我希望两个对象都有完全独立的表。。碰巧这些表共享一些列名。大多数情况下,我想在两者之间分享方法。模块不能工作,因为它会覆盖Objekt的列定义(或者会覆盖)。我更喜欢遵循组合而不是继承的模式。您能否将这些方法从模板中移到一个模块中,并根据需要在Objekt中包含/扩展它们?然后它们都可以继承自ActiveRecord::Base
。应该注意的是,如果status不是列名,那么这种方法是有效的。例如,因为我将random_column_name作为一个列,所以我只是在“Super class”中定义了它,而没有在模块中定义它。所以,我学到的是:模块可以用于两个活动记录模型之间的共享方法,这样这些方法就不是其中一个模型中的列了。感谢您的勾选:)应该注意的是,如果status不是列名,则此选项有效。例如,因为我将random_column_name作为一个列,所以我只是在“Super class”中定义了它,而没有在模块中定义它。所以,我学到的是:模块可以用于两个活动记录模型之间的共享方法,这样这些方法就不是其中一个模型中的列了。谢谢你的提示:)