从符号获取模型类

发布于 2024-10-22 06:04:13 字数 349 浏览 6 评论 0原文

我正在实现一种方法,该方法将在项目的许多地方使用。

def do association

end

“association”是一个符号,如:articles:tags:users等。

当关联为:articles时code>,我需要使用 Article 模型。

当关联为 :users 时,我需要使用 User 模型。

等等。

我知道,我可以编写一个辅助方法,根据提供的符号返回模型类。但是有没有现成的方法呢?

I'm implementing a method, that will be used in many places of a project.

def do association

end

"association" is a symbol, like :articles, :tags, :users etc.

When the association is :articles, I need to work with the Article model.

When the association is :users, I need to work with the User model.

Etc.

I know, that I can write a helper method, that returns model class, depending on the provided symbol. But is there a ready to use method for that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放血 2024-10-29 06:04:13

为此,Rails 在 String 类上提供了一个名为 classify 的方法。

:users.to_s.classify.constantize
#User

:line_items.to_s.classify.constantize
#LineItem

编辑

如果您尝试检索与关联关联的类,请使用此方法:

Author.reflect_on_association(:books).klass
# => Book

这将解决关联名称与类名称不匹配的情况。

例如:

class Order
  has_many :line_items
  has_many :active_line_items, :class_name => "LineItem", 
             :conditions => {:deleted => false}
end

在上面的示例中, :active_line_items 将导致 ActiveLineItem 并且我们的原始代码将抛出错误。

请在此处了解更多相关信息。

Rails provides a method called classify on the String class for such purpose.

:users.to_s.classify.constantize
#User

:line_items.to_s.classify.constantize
#LineItem

Edit:

If you are trying to retrieve the class associated with an association, use this approach:

Author.reflect_on_association(:books).klass
# => Book

This will address the scenario where the association name doesn't match the class name.

E.g:

class Order
  has_many :line_items
  has_many :active_line_items, :class_name => "LineItem", 
             :conditions => {:deleted => false}
end

In the example above, :active_line_items will result in ActiveLineItem and our original code will throw error.

Read more about this here.

且行且努力 2024-10-29 06:04:13

这会起作用

(:users.to_s.singularize.capitalize.constantize).find :all, :conditions => ["name = ?", "john"]

并以你的例子为例

association.to_s.singularize.capitalize.constantize

This will work

(:users.to_s.singularize.capitalize.constantize).find :all, :conditions => ["name = ?", "john"]

And with your example

association.to_s.singularize.capitalize.constantize
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文