gpt4 book ai didi

ruby-on-rails - 子文件夹和关系中的 Rails 模型

转载 作者:数据小太阳 更新时间:2023-10-29 07:05:35 24 4
gpt4 key购买 nike

我在自动加载的文件夹中组织了一些 Rails 模型

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]

我可以直接使用所有模型(例如 Image.first.file_name)但是当我尝试通过关系访问它们时,例如@housing.images.each do... 使用 has_many: images 我得到以下错误

Unable to autoload constant Housing::HousingImage, expected /path/app/models/housing/image.rb to define it

如何让 Rails 将我的模型用于关系方法?

我正在运行 ruby​​ 2.2 和 rails 4.2

最佳答案

Rails 会自动从子文件夹加载模型,但希望它们具有命名空间。

/app/models/user.rb
class User
end

/app/models/something/user.rb
class Something::User
end

如果您没有在子文件夹中正确命名您的模型,它会弄乱 Rails 自动加载器并导致如您所见的错误。

删除这个

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]

并为您的模型添加适当的命名空间,一切都会正常进行。

您可以像这样在您的关系中轻松使用命名空间模型:

class User
has_many :photos, class_name: 'Something::Photo'
end

user.photos (will be instances of Something::Photo)

如果您不想使用命名空间但出于其他原因拆分您的模型,您可以在顶层执行此操作并使用模型旁边的其他文件夹。默认情况下,rails 会加载应用程序中的所有文件夹,因此您可以在“models”旁边创建一个文件夹“models2”或您想要的任何名称。这不会对 Rails 类加载的功能产生任何影响。

根据您的示例,您可以执行以下操作:

/app
/controllers
/models
for all your normal models
/housing
for your "housing" models

像这样您可以在顶级命名空间直接访问它们,无需 class_name 设置或任何需要的东西。

关于ruby-on-rails - 子文件夹和关系中的 Rails 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28609518/

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