gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:31:01 25 4
gpt4 key购买 nike

我有一个名为 Books 的 ActiveRecord 模型,它有一个 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。在发布者表中存储数字发布者

使用 DigitalPublishertype 列的数字出版商使用单表继承 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com