我有用户,他们有宠物。各种宠物。爬行动物、鱼类、鸟类和哺乳动物。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的一个示例。我曾希望得到一个哺乳动物类的示例。
2条答案
按热度按时间aemubtdh1#
我觉得你是在搬起石头砸自己的脚。如果你有一个狗和猫类,而不仅仅是一个哺乳动物类,那么它们可能值得拥有自己的控制器。如果它们的行为相同,那么就将它们作为具有共享行为的父类的平凡子类。
但如果你真的想做你描述的,我可能会这样做:
字符串
不过,我最好还是在路上开路。
型
ccrfmcuu2#
更新:在我写了这个答案之后,现在被接受的答案被发布了,它是在routes.rb中分配正确的控制器。这以更好的方式解决了我的问题。
亚历克斯在对问题的评论中写下了正确答案。它是:
字符串
api.rubyonrails.org文档
当检索最后一个宠物时,我在用户模型中调用它,如下所示:
型
所以现在我可以放心地使用
redirect_to current_user.last_pet || root_path
重定向了。再次感谢亚历克斯。