ruby-on-rails - Rails 2.3 基于其他关联的动态 has_many 条件

标签 ruby-on-rails associations has-many ruby-on-rails-2

我有一个名为 Books 的 ActiveRecord 模型,它在 authors 上有一个 has_one 关联,在 authors 上有一个 has_many 关联出版商。所以下面的代码就很好了

书籍出版商

现在我有另一个 AR 模型,digital_publishers,它很相似,但如果这本书的作者响应 digital?,我想透明地使用它 - 让我解释一下代码

normal_book = Book.find(1)
normal_book.author.digital? #=> false
normal_book.publishers #=> [Publisher1, Publisher2, ...]

digital_book = Book.find(2)
digital_book.digital? #=> true
digital_book.publishers #=> I want to use the DigitalPublishers class here

因此,如果这本书的作者是数字的(作者是通过 has_one :author 关联设置的,因此它不像在 books 表上使用带有 SQL 条件的 has_many 那样简单),我仍然想要能够对其调用 .publishers ,但返回一个 DigitalPublishers 列表,因此我希望对我的 has_many 关联有一些条件首先检查图书是否是数字图书,如果是,则使用 DigitalPublishers 类而不是 Publishers 类。

我尝试使用以下代码使用 after_find 回调:

after_find :alias_digital_publisher

def alias_digital_publisher
  if self.author.digital?
    def publishers
      return self.digital_publishers
    end
  end
end

但这似乎并没有起到作用。另外,我正在使用 Rails 2.3。

最佳答案

我需要有关该项目的更多信息才能真正提出建议,但这里有一些需要考虑的想法:

1。出版商不应该属于书籍

我猜测出版商可能会链接到不止一本书,因此它们属于书籍并没有多大意义。我会考虑

#Book.rb
has_many :publishers, :through=>:publications

2。将数字出版商存储在出版商表中

对于 type 列为 DigitalPublisher 的数字出版商,可以使用单表继承 (STI),或者仅添加一个 bool 值来指示出版商是否为数字出版商。

这样,您只需调用 book.publishers 即可,您将获得可能是也可能不是数字的出版商,具体取决于分配的出版商。

诀窍在于,您需要确保只有数字出版商才能分配到具有数字作者的图书。不过这对我来说很有意义。

3。 (或者)为发布者添加方法

def book_publishers
   author.digital? ? digital_publishers : publshers
end

我不太喜欢这个选项,我认为最好将所有发布商放在一张表中。

关于ruby-on-rails - Rails 2.3 基于其他关联的动态 has_many 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12247004/

相关文章:

c++ - 如何在Windows 8中设置关联?

javascript - sequelize 上的 belongsToMany 是否会自动创建新的连接表?

ruby-on-rails - Rails 找到所有与关联

php - Laravel hasMany 关系选择特定列问题

ruby-on-rails - HABTM 避免连接表中的欺骗

ruby-on-rails - 在两个 Rails 服务器之间传输数据

ruby-on-rails - 没有路由匹配 [GET] "/admin/sign_out"

ruby-on-rails - 为什么这个 rake 任务运行两次?

ruby-on-rails - Rails4 has_many 通过带参数

forms - 具有多态 has_many 模型的嵌套属性