ruby-on-rails 当primary_key没有明确的模型时可用时has_many

lxkprmvk  于 2023-04-22  发布在  Ruby
关注(0)|答案(1)|浏览(109)

有一个模型名为:作者有很多书。
由于传统原因,authors表中有一列,名为:favorite_books,基本上是作者最喜欢的书的id的数组。
我想根据favorite_books列中的id在Author模型中定义一个has_many关联到图书。类似于以下内容:

class Author < ApplicationRecord
    has_many :books, through: -> { favorite_books } # it's invalid code as of now
  end

通过文档,我们可以传递像sourcesource_type这样的选项,但我不确定是否可以传递列。

ghhaqwfi

ghhaqwfi1#

不幸的是,你不能建立这样的联系。你有两个选择
定义一个这样的方法,它将返回一个集合

def favorite_books
  Booke.where(id: self.favorite_books)
end

这不是一个成熟的关联,因此不会有author.favourite_books << Book.new等好东西。
另一种方法,但需要更多的工作,是将其重构为Author和Book之间的多对多关系。在Rails中有两种方法,要么是has_many through,要么是has_and_belongs_to_many`。Rails Guides有一个很好的部分,介绍如何选择一个https://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many
第二种解决方案需要数据迁移,这可能是一个多步骤的过程:

  • 创建新表
  • 基于现有列在新表中填充数据
  • 删除列有关于如何避免停机、数据丢失等的注意事项。

如果你有任何后续问题,我很乐意扩展答案。

相关问题