2016-03-16 5 views
0

Привет Я создаю игровой контроллер для отображения Q/A игрынеопределенный метод `<<» для # <Ответ :: ActiveRecord_Relation: 0x007fada31c7430>

И я блокированы <<, вот код

def play 
    lvlup(lvl) 
    if lvl == 1 
     set_questions 
    else 
     get_questions 
    end 
    @answers = Answer.where.not(id: question.answer_id).limit(2).order("RANDOM()") 
    @answer ||= [] 
    @answers << question.answer 
    @answers = @answers.shuffle 
    render 'play' 
    end 

Я создаю массив, и я отвечу на соответствующий ответ в глобальных ответах, которые я хочу отобразить 4 Макс.

Почему здесь не указано?

Вот весь код

class GamesController < ApplicationController 
attr_accessor :lvl 

    def welcome 
    end 

    def congrat 
    end 

    def play 
    lvlup(lvl) 
    if lvl == 1 
     set_questions 
    else 
     get_questions 
    end 
    @answers = Answer.where.not(id: question.answer_id).limit(2).order("RANDOM()") 
    @answer ||= [] 
    @answers << question.answer 
    @answers = @answers.shuffle 
    render 'play' 
    end 

    def loose 
     @question = Question.find(params[:question]) 
     flash.now[:alert] = "Miss..." 
     render 'loose' 
    end 

    def check 
    @lvl = params[:lvl].to_i 
    answer_id = params[:id].to_i 
    question = Question.find(params[:question]) 
    if @lvl == lvlmax 
     render action: 'congrat' and return 
    elsif answer_id == question.answer_id 
     flash.now[:notice] = "Well done !" 
     play 
    else answer_id != question.answer_id 
     loose 
    end 
    end 

    private 

    def lvlup(value) 
    @lvl = 1 + value.to_i 
    end 
    def lvlmax 
    @lvlmax = Question.all.count 
    end 

    def set_questions 
    @questionsids = [] 
    Question.all.shuffle.each do |d| 
     @questionsids << d.id 
    end 
    cookies[:questions] = @questionsids 
    end 

    def get_questions 
    @questions = cookies[:questions].split('&') 
    end 

    def questions 
    @questions = cookies[:questions] 
    end 

    def question 
    @question = Question.find(questions[lvl]) 
    end 

end 

Спасибо за помощь.

ответ

0

mtrolle в может быть правильным, но у меня есть сомнения относительно того, почему ActiveRecord::Relation не был возвращен как массив по умолчанию. (Также, как упоминалось в его комментарии.)

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

Answer.where.not(id: question.answer_id).limit(2).order("RANDOM()") 

возвращает ActiveRecord::Relation объект. И это приводит к следующему SQL:

SELECT `answers`.* FROM `answers` WHERE (id != ID) ORDER BY RANDOM() LIMIT 2 

При попытке запуска то же самое в MySQL, я получаю:

ERROR 1305 (42000): FUNCTION database.RANDOM does not exist 

Видимо MySQL не имеет RANDOM() функцию, вместо этого он использует RAND().

Преобразование ActiveRecord запроса соответственно возвращается правильный массив для меня:

Answer.where.not(id: question.answer_id).limit(2).order("RAND()") 
+0

Вы имеете в виду, что я меняю «RANDOM» на «RAND»? Но он снова прерывает ошибку в моем коде. Сделайте это правильно для вас? –

2

Вы пытаетесь добавить к результату @answers - это отношение ActiveRecord, вы не можете добавлять данные в этот массив.

Добавить .to_a в конце вашей линии, где вы установили @answers, чтобы вы могли добавлять к массиву. Ответ

@answers = Answer.where.not(id: question.answer_id).limit(2).order("RANDOM()").to_a 
+1

Что весьма удивительно, что связь делегатов по умолчанию отсутствует методы для 'to_a'. Так почему же это случилось в этом случае? – BroiSatse

+0

Хорошо, кое-что копалось, и кажется, что эта делегация не так проста, как просто идет с 'method_missing', так как некоторые методы должны быть делегированы в класс отношений. Логику делегирования можно найти здесь: https://github.com/rails/rails/blob/a419a4d9ade48e777166ff956dd7bb24e37b2181/activerecord/lib/active_record/relation/delegation.rb – BroiSatse

+0

@mtrolle Я тестирую с 'to_a', и он работает. Почему в другом коде мы не используем это, и он работает? –