代码之家  ›  专栏  ›  技术社区  ›  Trip

如何将var从一个模型的方法传递到另一个模型的方法?

  •  0
  • Trip  · 技术社区  · 14 年前

    这是我的一个模型。。

    def credit_status_on_create
      Organization.find(self.organization_id).update_credits
    end
    

    这是我的另一个模型。正如你所看到的,我在这里写的是一个传递var的错误方法

    def update_credits
       @organization = Organization.find(params[:id])
       credit_count = @organization.card_signups.select { |c| c.credit_status == true}.count
    end
    

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  1
  •   Harish Shetty    14 年前

    理想情况下,控制器可以访问的数据应该作为参数传递给模型方法。所以我建议你看看是否有可能重写你的代码。但这里有两种可能的解决方法。我更喜欢后者,因为它是通用的。

    class CardSignup
     attr_accessor call_context
     def call_context
       @call_context || {}
     end
    end
    

    在控制器代码中:

    def create
      cs = CardSignup.new(...)
      cs.call_context = params
      if cs.save
        # success
      else
        # error
      end
    end
    

    在您的CardSignup模型中:

    def credit_status_on_create
      Organization.find(self.organization_id).update_credits(call_context)
    end
    

    def update_credits
      @organization = Organization.find(call_context[:id])
      credit_count = @organization.card_signups.count(:conditions => 
                      {:credit_status => true})
    end
    

    方法2:声明所有模型都可以访问的线程局部变量

    您的控制器代码:

    def create
      Thread.local[:call_context] = params
      cs = CardSignup.new(...)
      if cs.save
        # success
      else
        # error
      end
    end
    

    Organization 模型。注意计数逻辑的变化。

    def update_credits
      @organization = Organization.find((Thread.local[:call_context] ||{})[:id])
      credit_count = @organization.card_signups.count(:conditions => 
                      {:credit_status => true})
    end
    
        2
  •  0
  •   Aaron Yodaiken Stephen Chung    14 年前

    使用属性访问器。

    例如。,

    class << self
      @myvar = "something for all instances of model"
      attr_accessor :myvar
    end
    @myothervar = "something for initialized instances"
    attr_accessor :myothervar
    

    然后你可以访问它们作为 ModelName.myvar ModelName.new.myvar

        3
  •  0
  •   bjg    14 年前

    您并没有说是使用Rails2还是3,但我们假设Rails2就是为了这个目的(Rails3提供了一个新的DSL来构造查询)。

    named_scope :update_credits,
                lambda { |id| { :include => :card_signup, :conditions => [ "id = ? AND card_signups.credit_status = TRUE", id ] } }
    

    然后按如下方式使用:

    def credit_status_on_create
      Organization.update_credits(self.organization_id)
    end