ruby-on-rails 如何在Ruby on Rails类中获取基类的示例,并使用继承类(STI)

pcrecxhr  于 2023-08-08  发布在  Ruby
关注(0)|答案(2)|浏览(120)

我有用户,他们有宠物。各种宠物。爬行动物、鱼类、鸟类和哺乳动物。Mammal模型有两个子类,通过单表继承(STI)继承:猫和狗我的用户有一个方法来获得他们的最后一个宠物。
在一个静态页面控制器中,我有一个方法来访问用户的最后一个宠物:

def go_to_pet
    redirect_to current_user.last_pet || root_path
  end

字符串
现在我遇到的问题是,当猫或狗作为用户的最后一个宠物返回时,应用程序正在寻找猫或狗控制器,但我只有并且需要一个哺乳动物控制器。哺乳动物控制器在实际调用时可以很好地处理猫和狗。
我的问题是这样的:如何检索Mammal类的示例?我试过Mammal.find(cat.id),但它会自动返回一只猫,因为这就是STI的全部意义。
我能想到的唯一丑陋的解决方法是检查静态页面控制器中的类(在上面的代码块中),然后让redirect_使用mammals控制器,但我宁愿避免这种情况。
我试图通过Mammal.find(www.example.com)显式地加载基类cat.id,但是它会自动返回继承类Cat的一个示例。我曾希望得到一个哺乳动物类的示例。

aemubtdh

aemubtdh1#

我觉得你是在搬起石头砸自己的脚。如果你有一个狗和猫类,而不仅仅是一个哺乳动物类,那么它们可能值得拥有自己的控制器。如果它们的行为相同,那么就将它们作为具有共享行为的父类的平凡子类。
但如果你真的想做你描述的,我可能会这样做:

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'

ccrfmcuu

ccrfmcuu2#

更新:在我写了这个答案之后,现在被接受的答案被发布了,它是在routes.rb中分配正确的控制器。这以更好的方式解决了我的问题。
亚历克斯在对问题的评论中写下了正确答案。它是:

becomes(Mammal)

字符串
api.rubyonrails.org文档
当检索最后一个宠物时,我在用户模型中调用它,如下所示:

if @pet.instance_of?(Cat) || @pet.instance_of?(Dog)
  @pet = @pet.becomes(Mammal)
end


所以现在我可以放心地使用redirect_to current_user.last_pet || root_path重定向了。再次感谢亚历克斯。

相关问题