Rails: как управлять find (параметрами[])

#ruby-on-rails #params

#ruby-on-rails #параметры

Вопрос:

Я пытаюсь использовать Object.find(параметры []), чтобы возвращать объекты только с:stage_id = integer

Вот мой код контроллера

 def show
    @lesson = Lesson.find(params[:id])
    @stage1 = @lesson.units(params[:stage_id] == 1)
    @stage2 = @lesson.units(params[:stage_id] == 2)
  

В каждом уроке много блоков, каждый блок имеет либо stage_id = 1, либо stage_id = 2, я хочу, чтобы @stage1 стал массивом с блоками, которые имеют только значение stage_id, равное 1. То же самое касается stage2.

Как я могу правильно использовать параметры, чтобы возвращать только единицы измерения, которые имеют указанные табличные значения?

Комментарии:

1. Похоже, вы не разбираетесь в языке Ruby и / или Rails. Вам было бы лучше купить книгу по ruby / rails и прочитать ее вместо того, чтобы задавать вопросы, подобные этим здесь.

2. это довольно неудачно, поскольку я прочитал несколько книг, и изучение stackoverflow, похоже, работает лучше всего, когда я просматриваю учебные пособия. Есть ли у вас какие-либо конкретные рекомендации?

3. На самом деле, любой. Код, приведенный в вашем вопросе, далек от того, чтобы быть действительным. Предполагается, что Stackoverflow — это не место для изучения языка, а скорее для расширения существующих знаний о языке и / или решения проблем, которые нелегко решить с помощью RTFM или Google.

4. Проверьте Rails на наличие зомби . Хотя fx_ был немного резок, он, вероятно, прав в том, что любая книга по Rails будет содержать запросы того типа, о котором вы спрашиваете здесь. Тем не менее, добро пожаловать в SO.

5. спасибо :), возможно, я пропустил их при первом просмотре, много информации для переварки, ха-ха

Ответ №1:

 def show
  @lesson = Lesson.find(params[:id])
  @stage1 = @lesson.units.first(:conditions => { :stage_id => 1 })
  @stage2 = @lesson.units.first(:conditions => { :stage_id => 2 })
end
  

Комментарии:

1. @lesson.units возвращает прокси-сервер ассоциации. Это работает вроде как сочетание массива и класса модели. Поэтому first указывает ему возвращать один объект вместо массива объектов.

Ответ №2:

Ссылка на find

 @stage1 = Unit.find(:all, :conditions => ["stage_id=? AND lession_id=?" 1, params[:id]])


@stage2 = Unit.find(:all, :conditions => ["stage_id=? AND lession_id=?" 2, params[:id]])
  

Комментарии:

1. спасибо вам за это, по какой причине вы решили не использовать @lesson?

Ответ №3:

Если блоки «всегда» будут структурированы с помощью этапов, единственное, что вы могли бы сделать, чтобы сократить объем своего кода, — это создать модель этапа. Это позволяет гибко добавлять дополнительные этапы в будущем без нарушения кода. Предполагая, что связь установлена правильно и данные в порядке, вы могли бы сделать что-то вроде следующего.

код контроллера

 @lesson = Lesson.find(params[:id])
  

просмотр кода (haml)

 - for stage in @lesson.stages
  = stage.name
  - for unit in stage.units
    = unit.name
  

Комментарии:

1. спасибо за предложение. Я планирую использовать модули различными способами, помимо простых этапов. Этапы являются отправной точкой. В конечном итоге я буду использовать модули в других уроках. Трудно полностью понять, как я планирую использовать их при создании веб-приложения. это, кажется, самое сложное для понимания, поскольку оно постоянно меняется.