And*_*ren 5 ruby mysql activerecord ruby-on-rails ruby-on-rails-3
我已经为名为TestAppTv的数据库建立了一个带有MySQL的命名空间Rails 3.2.19引擎,其中包含2个模型:Post和Comment.
我希望评论属于帖子,但我希望它具体引用TestAppTv :: Post.我知道我可以通过指定class_name以及belongs_to/has_many调用来实现此目的.
module TestAppTv
class Comment < ActiveRecord::Base
belongs_to :post, class_name: "TestAppTv::Post"
attr_accessible :text
end
end
module TestAppTv
class Post < ActiveRecord::Base
has_many :comments, class_name: "TestAppTv::Comment"
attr_accessible :text, :title
end
end
Run Code Online (Sandbox Code Playgroud)
现在,我的困惑在于数据库.看来test_app_tv_comments表中默认的foreign_key是"post_id".但是,在我看来,这并不遵循与应用程序其余部分相同的名称空间构思.似乎post_id是指引用test_app_tv_posts.id还是来自基本应用程序或其他引擎的某些基本posts.id表,这似乎不明确.
是否有一些正确的方法可以将rails默认使用的foreign_key命名为所有内置魔法?
当我尝试使用foreign_key手动将密钥指定为test_app_tv_post_id时,我最终遇到了很多关于"逆"的问题,并且默认的魔术助手不再工作了.例如,执行TestAppTv :: Comment.create(post:TestAppTv :: Post.first,text:"test")不起作用,我必须自动指定foreign_key字段.
感谢您对此主题的任何建议或帮助!我很感激!
如果有人在将来发现这篇文章,并且因为我所说的为什么外键不是命名空间而被混淆了,答案是它没有命名空间并不重要.
由于Ruby通过首先查看当前模块然后将模块树向上移动到基本命名空间来处理类查找,因此在包含引擎的基本应用程序中定义的任何模型之前,将使用在相同Rails引擎中定义的模型.这意味着对于引用特定TestAppTv :: Post的命名空间引擎,"post_id"字段就足够了,因为TestAppTv :: Post是在TestAppTv引擎模块中查找类"Post"时首先找到的.
据我所知,这在任何地方都没有提到,所以我认为这可能只是假设是常见的红宝石知识.我希望这可以帮助其他人.