我正在使用Ruby on Rails 3.2.2,我想知道处理has_many :through
ActiveRecord::Association
的关联对象的常用方法是什么。也就是说,我有:
class User < ActiveRecord::Base
has_many :article_editor_associations, :class_name => 'Articles::UserEditorAssociation'
has_many :articles, :through => :article_editor_associations
end
class Article < ActiveRecord::Base
has_many :user_editor_associations, :class_name => 'Articles::UserEditorAssociation'
has_many :editor_users, :through => :user_editor_associations
end
class Articles::UserAssociation < ActiveRecord::Base
belongs_to :editor_users
belongs_to :articles
end
通过使用上面的代码,我可以运行@article.editor_users
方法,以便检索编辑器 Array
的{{1}}。但是,为了使事情更好地适应我的应用程序(例如,为了以“程序化”的方式处理像I18n翻译和类似的东西),我想在我的应用程序中添加一个新的模型如下:
User
这样,通过我的应用程序,我可以引用class EditorUser < User # Note the class name and the class inheritance
...
end
类来处理文章“编辑器用户”实例,好像它们是EditorUser
个对象...更多,因为继承,所以User
类我可以声明“特定方法”(例如,范围方法)仅适用于EditorUser
实例(而不是EditorUser
个实例)......
在我的案例中,这是一种“常见”的做法吗?它是“Rails方式”吗?如果是这样,我能/应该做些什么来处理这种情况?如果不是,我该怎样/应该继续?
换句话说,我想使用类User
,因为关联的EditorUser < User ... end
对象(通过运行EditorUser
方法检索)是@article.editor_users
个对象。我认为通过在User
目录(或其他地方)中声明EditoUser
类可以简化我的应用程序中的内容,因为您可以解决该常量名称(例如,您可以使用该常量“播放” name以“构建”翻译字符串或通过声明仅用于app/models
实例的新方法。)
答案 0 :(得分:1)
使用Rails,我学会了首先关注命名约定和标准用法('约定优于配置),并将其设置为:
class User < ActiveRecord::Base
has_many :editors
has_many :articles, :through => :editors
end
class Article < ActiveRecord::Base
has_many :editors
has_many :users, :through => :editors
end
class Editor < ActiveRecord::Base
belongs_to :user
belongs_to :article
end
您可以使用联接记录的存在,例如如果您想要不同的编辑器访问级别,请使用User.editor或向编辑器添加其他属性。
以上并不能完全回答你的问题,但应该是一个很好的起点。我这样说是因为有关rails的一个最重要的事情是它使用了'约定优于配置'的原则。这很好,因为它导致简洁,极简主义的代码。这很糟糕,因为你必须学习所有的公约。如果您不了解它们或框架,那么您可能会遇到很多问题,就像我在许多我多年来使用的rails应用程序中看到的那样。
所以我的建议是退后一步。不要试图强制使用类重命名之类的东西。如果我显示的设置不符合您的需求,请重新审视您的需求,并阅读API中有关活动记录和关联的更多信息。我知道这对于使用rails有一段时间可能有点令人沮丧,但是你真的需要看看如果你要成为一名优秀的铁轨程序员,那么如何以正确的方式做事。