如何处理`has_many:through`关联的关联对象?

时间:2012-08-19 11:56:41

标签: ruby-on-rails ruby ruby-on-rails-3 associations naming-conventions

我正在使用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实例的新方法。)

1 个答案:

答案 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有一段时间可能有点令人沮丧,但是你真的需要看看如果你要成为一名优秀的铁轨程序员,那么如何以正确的方式做事。