【问题标题】:Active Record with Delegate and conditions带委托和条件的活动记录
【发布时间】:2009-11-12 10:56:32
【问题描述】:

是否可以在您的 Active Record 模型中使用委托并在其上使用 :if 之类的条件?

class User < ApplicationRecord
  delegate :company, :to => :master, :if => :has_master?

  belongs_to :master, :class_name => "User"

  def has_master?
    master.present?
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby activerecord delegates


    【解决方案1】:

    不,你不能,但你可以通过 :allow_nil =&gt; true 选项返回 nil,如果 master 为 nil。

    class User < ActiveRecord::Base
      delegate :company, :to => :master, :allow_nil => true
    
      # ...
    end
    
    user.master = nil
    user.company 
    # => nil
    
    user.master = <#User ...>
    user.company 
    # => ...
    

    否则,您需要编写自己的自定义方法,而不是使用委托宏来获得更复杂的选项。

    class User < ActiveRecord::Base
      # ...
    
      def company
        master.company if has_master?
      end
    
    end
    

    【讨论】:

    • 他可以使用新的 try 语法:master.try(:company) 如果 master 为 nil,则返回 nil。
    • try 仅在 ruby​​ 1.9 中可用
    • Try 可通过 ActiveSupport 在任何 Ruby 实现中使用,但它需要 ActiveSupport >= 2.3。此外,在这段代码中,我没有看到使用 try() 的任何真正优势,所以我选择了经典实现。
    【解决方案2】:

    我需要将相同的方法委托给两个模型,我更喜欢使用一个模型而不是另一个模型。我使用了 :prefix 选项:

    来自个人.rb

    delegate :referral_key, :email, :username, :first_name, :last_name, :gender, :approves_email, :approves_timeline, to: :user, allow_nil: true, prefix: true                                
    delegate :email, :first_name, :last_name, to: :visitor, allow_nil: true, prefix: true
    
    def first_name
      user.present? ? user_first_name : visitor_first_name
    end
    

    【讨论】:

      猜你喜欢
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多