ruby-on-rails – STI和多形体

我的代码有问题
class Post < ActiveRecord::Base
end

class NewsArticle < Post
  has_many :comments,:as => :commentable,:dependent => :destroy,:order => 'created_at'
end

class Comment < ActiveRecord::Base
  belongs_to :commentable,:polymorphic => true,:counter_cache => true
end

并尝试去获取一些新闻文章评论我在日志中看到的东西

Comment Load (0.9ms)   SELECT "comments".* FROM "comments" WHERE ("comments"."commentable_id" = 1 and "comments"."commentable_type" = 'Post') ORDER BY created_at

奇怪的是“commentable_type”=’Post’.
怎么了?

PS:Rails 2.3.5&&ruby1.8.7(2010-01-10 patchlevel 249)[i686-darwin10]

解决方法

commentable_type字段需要存储包含数据的表的名称,一旦从正确的表中加载该行,继承的类型将从帖子表的类型列中加载.

所以:

这里的评论指向它的评论表.帖子表,id 1

>> Comment.first
=> #<Comment id: 1,commentable_id: 1,commentable_type: "Post",body: "test",created_at: "2010-04-09 00:56:36",updated_at: "2010-04-09 00:56:36">

然后加载NewsArticle,id 1从帖子加载,类型在那里指示一个NewsArticle.

>> Comment.first.commentable
=> #<NewsArticle id: 1,type: "NewsArticle",name: "one",body: "body",created_at: "2010-04-09 00:55:35",updated_at: "2010-04-09 00:55:35">
>> Comment.first.commentable.class.table_name
=> "posts"

如果commentable_type持有“NewsArticle”,则必须查看该类来确定该表.这样,它可以只是看着表,并担心类型一旦到达那里.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...