在 Rails 中通过多态类型查找所有内容?
有没有办法在 Rails 中找到特定多态类型的所有多态模型?因此,如果我有组、事件和项目,它们都带有如下声明:
has_many :assignments, :as => :assignable
我可以做这样的事情:
Assignable.all
...或
BuiltInRailsPolymorphicHelper.all("assignable")
那就太好了。
编辑:
...这样 Assignable.all
返回 [Event, Group, Product]
(类数组)
Is there a way to find all Polymorphic models of a specific polymorphic type in Rails? So if I have Group, Event, and Project all with a declaration like:
has_many :assignments, :as => :assignable
Can I do something like:
Assignable.all
...or
BuiltInRailsPolymorphicHelper.all("assignable")
That would be nice.
Edit:
... such that Assignable.all
returns [Event, Group, Product]
(array of classes)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
没有直接的方法可以做到这一点。我为
ActiveRecord::Base
编写了这个猴子补丁。这适用于任何班级。
现在您可以执行以下操作:
There is no direct method for this. I wrote this monkey patch for
ActiveRecord::Base
.This will work for any class.
Now you can do the following:
你也可以尝试这种方式。因为上面的解决方案对我不起作用,因为我有一些 mongo 的模型。
Anb 如此称呼它,
如果您想要多态记录而不是传递它,则第二个参数是可选的,否则将其保留为空白。
它将以字符串形式返回模型名称数组。
You can also try this way.cause above solution doesn't work for me cause i had some mongo's model.
Anb call it like
Here Second parameters is optional for if you want polymorphic records than pass it otherwise leave it as blank.
It will Return Array of Model name as String.
Harish Shetty 的解决方案不适用于未直接存储在 Rails.root/app/models 中而是存储在子目录。尽管它正确地全局匹配子目录中的文件,但在将文件名转换为常量时无法包含子目录。原因是,命名空间子目录被这一行删除:
这是我为保留命名空间子目录所做的操作:
这是完整修改的解决方案:
现在,该方法将 /models/test/tensile.rb 正确地转换为 Test ::在考虑其关联之前拉伸。
只是一个小小的改进,所有的功劳仍然归于 Harish!
Harish Shetty's solution will not work for namespaced model files which are not stored directly in Rails.root/app/models but in a subdirectory. Although it correctly globs files in subdirectories, it then fails to include the subdir when turning the file name into a constant. The reason for this is, that the namespacing subdir is removed by this line:
Here is what I did to retain the namespacing subdir:
Here's the full modified solution:
Now, the method will turn /models/test/tensile.rb correctly into Test::Tensile before reflecting on its associations.
Just a minor improvement, all credit still goes to Harish!
我使用“all”方法创建了一个多态模型类来测试这一点。
这是我的应用程序设置:
I created a polymorphic model class with a method 'all' to test this.
Here is my app setup:
您应该能够仅使用关联的集合:
You should be able to just use the associated collection: