#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. спасибо за предложение. Я планирую использовать модули различными способами, помимо простых этапов. Этапы являются отправной точкой. В конечном итоге я буду использовать модули в других уроках. Трудно полностью понять, как я планирую использовать их при создании веб-приложения. это, кажется, самое сложное для понимания, поскольку оно постоянно меняется.