【问题标题】:Get model class from symbol从符号中获取模型类
【发布时间】:2011-07-16 00:51:27
【问题描述】:

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

def do association

end

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

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

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

等等

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

【问题讨论】:

    标签: ruby-on-rails model symbols


    【解决方案1】:

    这会起作用

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

    还有你的例子

    association.to_s.singularize.capitalize.constantize
    

    【讨论】:

    • 当类名有两部分时,此解决方案将不起作用,例如::order_details 将导致Order_detail 而不是OrderDetail
    【解决方案2】:

    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 并且我们的原始代码会抛出错误。

    阅读更多关于here的信息。

    【讨论】:

    • 您还应该查看#safe_constantize 变体,它与#constanzize 基本相同,但如果找不到类,则不会引发 NameError。相反,它返回nil。事实证明,这比异常更方便一些。例如:model_name.to_s.classify.safe_constantize || Event
    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2011-01-25
    • 2011-06-20
    相关资源
    最近更新 更多