我有一个名为 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/