这是我的一个模特..
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])完成,它可以做什么?
谢谢!
答案 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.myvar
和ModelName.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
不可否认,我不太了解计数器在你的逻辑中的作用,但我相信如果你采用它,你可以将其反馈到这个建议中。