我有用户,他们有宠物.各种各样的宠物.爬行动物、鱼、鸟和哺乳动物.哺乳动物模型有两个子类,通过单表继承(STI)继承:cat 和狗.我的用户有一种方法可以得到他们的最后一只宠物.

在静态页面控制器中,我有一个方法来访问用户的最后一个宠物:

  def go_to_pet
    redirect_to current_user.last_pet || root_path
  end

现在我遇到的问题是,当一只cat 或一只狗被作为用户的最后一只宠物返回时,应用程序正在寻找cat 或狗的控制器,但我只有而且需要一个哺乳动物控制器.当哺乳动物控制器被实际调用时,它可以很好地处理cat 和狗.

我的问题是:如何检索Mammal类的实例?我try 过MamMal.find(cat.id),但它会自动返回一只cat ,因为这就是STI的全部意义所在.

我能想到的唯一难看的解决办法是判断静态页面控制器中的类(在上面的代码块中),然后让reDirect_使用哺乳动物控制器,但我想避免这种情况.

我试图通过MamMal.find(cat.id)显式加载基类,但它根据类型列自动返回继承类Cat的一个实例.我曾希望得到一个哺乳动物类的实例.

推荐答案

我觉得你是在自食其果.如果你有一个Dog and Cat类,而不仅仅是一个哺乳动物类,那么它们可能值得拥有自己的控制器.如果它们的行为相同,那么只需使它们成为具有共享行为的父类的无关紧要的子类.

但如果你真的想做你所描述的事情,我可能会这样做:

  def go_to_pet
    last_pet = current_user.last_pet
    if last_pet.class.superclass.abstract_class?
      redirect_to url_for(controller: last_pet.class.base_class.name.tableize, id; last_pet.id)
    else
      redirect_to current_user.last_pet || root_path
    end
  end

但大多数情况下,我可能会把它挡在路由上.

  resources :dogs, controller: 'mammals'

Ruby-on-rails相关问答推荐

Rails HotWire和View Components:涡轮框架不会取代内容

带有rails 7.1的Lightbox2未初始化

Rails7--如何使用内联代码仅为操作运行BEFORE操作

多对多模型通过控制台创建记录不起作用

Rails ActiveRecord::LogSubscriber 不输出详细查询日志(log)

获取所有属于模型的嵌套对象

Rails 6:强类型原始 SQL 查询返回数组类型

如何在 Arel 中重用单个绑定变量?

Rails - 如何使用子对象的嵌套属性和强参数填充父对象ID?

在 JS 模块中使用 Rails-UJS(带有 webpacker 的 Rails 6)

带有 Cucumber 和 rspec 的 BDD - 这什么时候是多余的?

使用回形针进行简单裁剪

Rails 将 form_for 对象传递给部分

如何在 Rails 1.2.3 中使复选框默认为选中?

Ruby on Rails 错误无法加载此类文件 - 更少

Ruby 和 Ruby on Rails 离线 API 文档

Rails 中是否有 HTML 安全截断方法?

如何在 Ruby on Rails 的内存缓存存储中列出键?

何时(如果)合并 ActiveRecord 迁移?

为什么 rails bootstrap 这么慢,我该怎么办?