0

我正在使用 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方法来检索EditorArray。但是,为了使事情更适合我的应用程序(例如,为了以“程序化”方式处理 I18n 翻译和类似的事情),我正在考虑向我的应用程序添加一个新模型,例如以下: User

class EditorUser < User # Note the class name and the class inheritance
  ...
end

这样,通过我的应用程序,我可以引用EditorUser该类,以便像处理User对象一样处理文章“编辑器用户”实例......更多,因为继承,EditorUser我可以在类中声明“特定方法”(例如,范围方法)仅适用于EditorUser实例(不适用于User实例)...

这是一种“常见”的方法来制作我想做的事情吗?是“铁路之路”吗?如果是这样,我可以/应该做什么来处理这种情况?如果没有,我怎么能/应该继续?


换句话说,我认为使用类EditorUser < User ... end是因为关联的对象(通过运行方法EditorUser检索)是对象。我认为通过在目录(或其他地方)中声明一个类可以简化我的应用程序中的事情,因为您可以解决该常量名称(例如,您可以“使用”该常量名称以“构建”翻译字符串或通过说明仅用于实例的新方法)。@article.editor_usersUserEditoUserapp/modelsEditorUser

4

1 回答 1

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 可能会令人沮丧很长一段时间,但如果你想长期成为一名优秀的 Rails 程序员,你真的需要看看如何以正确的方式做事。

于 2012-08-19T12:06:31.040 回答