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

时间:2010-06-30 21:17:56

标签: ruby-on-rails

这是我的一个模特..

CardSignup.rb

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

如果不能通过(params [:id])完成,它可以做什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

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

方法1:声明虚拟属性

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

答案 1 :(得分:0)

使用attr_accessor。

如,

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

然后您可以分别以ModelName.myvarModelName.new.myvar访问它们。

答案 2 :(得分:0)

你没有说你是使用Rails 2还是3,但让我们假设Rails 2用于此目的(Rails 3提供了一个新的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

不可否认,我不太了解计数器在你的逻辑中的作用,但我相信如果你采用它,你可以将其反馈到这个建议中。