2011-04-05 1 views
1

У меня есть этот скрипт в моем контроллере результатов:пользователей вводят результаты только один раз

distribution_sheet = DistributionSheet.find(:all, :conditions => ["lifecycle_state = ?","open"]).last 


    if distribution_sheet.nil? 
    redirect_to root_path #you could redirect somewhere else if you want 
     flash[:notice] = "There are currently no active EQAs" 
    # elsif (@result.size > 1) 
    # redirect_to root_path #you could redirect somewhere else if you want 
    # flash[:notice] = "You have already entered your EQA for EQA number #{distribution_sheet.id}" 
    else 
    flash[:notice] =  "EQA number #{distribution_sheet.id} is open for submissions" 
    end 

результат представляет собой модель. Мне нужно, чтобы пользователи вводили новые результаты, когда DistributionSheet «открыт» ТОЛЬКО ОДИН. Наверху elsif, похоже, не работает. Любой совет?

Вот где реферирована @result:

def new 
    @result = Result.new 
    distribution_sheet = DistributionSheet.find(:all, :conditions => ["lifecycle_state = ?","open"]).last 
    @result.distribution_sheet_id = distribution_sheet.id 
    10.times do 
      @result.specimen_results.build 

    end 
    specimen_ids = distribution_sheet.specimens.collect{|specimen| specimen.id} 
    @result.specimen_results.each do |specimen_result| 
     specimen_result.specimen_id = specimen_ids.shift 
    end 

    @result.lab_id = current_user.lab_id 

    end 
+0

Вам необходимо указать код, который ссылается на @result. – McStretch

+3

Дайте мне знать, если вам удастся прочитать свой собственный код, вставленный как комментарий. Как отредактировать свой вопрос и представить его правильно? – apneadiving

+0

не беспокойтесь о «образцах_результатах» и т. Д. @ Result.lab_id = current_user.lab_id говорит, что каждый пользователь, у которого есть свой lab_id, может просматривать только свои результаты. Мне нужно разрешить пользователю вводить результаты только один раз. – Mike

ответ

0

Пару вещей. Делая это:

distribution_sheet = DistributionSheet.find(:all, :conditions => ["lifecycle_state = ?","open"]).last 

Вы загружая каждый DistributionSheet объект в базе данных, которая отвечает этим условиям. Теперь это может показаться быстрым, но когда у вас будет тонна записей, это займет некоторое время. Лучше всего, чтобы сделать это вместо:

distribution_sheet = DistributionSheet.first(:conditions => "lifecycle_state = 'open'", :order => "id DESC") 

Это будет достичь той же цели, но не будет загружать все ассоциации в первую очередь, только одна запись вам нужно.

Во-вторых, возможно, вместо того, чтобы проверить @result.size > 1 вы должны проверять его на ассоциации вместо:

distribution_sheet.results.count > 1 

Это будет делать запрос SQL, чтобы подсчитать количество results для distribution_sheet объекта. Сначала у вас есть has_many :results в модели DistributionSheet.

Итак, еще пару вещей: я бы рекомендовал прочитать Getting Started guide, а также Association Basics guide, чтобы узнать основы, которые вам нужны, чтобы решить эту проблему правильно.

Смежные вопросы