Как передать переменную из метода одной модели в другую? - PullRequest
0 голосов
/ 01 июля 2010

Вот моя единственная модель ..

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 ]

1 голос
/ 01 июля 2010

В идеале данные, доступные для контроллера, должны передаваться в качестве параметра в методы модели.Поэтому я советую вам посмотреть, можно ли переписать ваш код.Но вот два возможных решения вашей проблемы.Я предпочитаю более поздний подход, поскольку он является общим.

Подход 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
0 голосов
/ 01 июля 2010

Вы не говорите, используете ли вы 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

По общему признанию, я не совсем понимаю роль счетчика в вашей логике, ноЯ уверен, что вы могли бы сделать это обратно в это предложение, если вы его примете.

0 голосов
/ 01 июля 2010

Используйте 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 соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...