Ruby on Rails 4 - сортировка записей в .each и создание записей - PullRequest
0 голосов
/ 28 января 2019

В моем приложении у меня есть 2 модели Post & PostTexts.

Каждый Post имеет language, position, title & description.

Позиции: Название и описание .

Коротко о моем заявлении, чтобы лучше понять .Пользователь входит и выбирает languages & тексты, которые он хочет, и получит результаты различных текстов сообщений, которые он может использовать.

Например, пользователь выбирает:

  • Заголовок 1 => должность: Заголовок
  • Заголовок 2 => Должность: Заголовок
  • Описание 1 => должность: Описание

Языки: Английский, Испанский

В настоящее время я создаю тексты по:

@languages = params[:languages].split(',')
@post_texts = params[:post_texts].split(',')
@post_texts.split(',').each do |id|
  @languages.split(',').each do |language|
    post_text = PostText.where(post_text_id: id)
    @titles = post_text.where(placement: 'title')
    @descriptions = banner_text.where(placement: 'description')
  end
end

@titles.each do |title|
  @descriptions.each do |description|
    Post.create(
        title: title.body,
        description: description.body,
        language: 'language here',
    )
  end
end

Это прекрасно работает, если я выбираю только 1 язык, и результат будет следующим:

Title 1 + Description 1
Title 2 + Description 1

Но когда я выбираю несколько языков, тексты смешиваются и испанские тексты смешиваются санглийский и наоборот.

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

, поэтому результат будет следующим:

English Title 1 + English Description 1
English Title 2 + English Description 1
Spanish Title 1 + Spanish Description 1
Spanish Title 2 + Spanish Description 1

Текущий результат: что-то , как показано ниже:

English Title 1 + English Description 1
English Title 1 + Spanish Description 1
Spanish Title 2 + Spanish Description 1
Spanish Title 2 + English Description 1

ps: Извините, если описаниеН не так хорошо

Я также проверил 2 разных способа, но результаты одинаковы:

1

@languages = params[:languages].split(',')
@post_texts = params[:post_texts].split(',')
@post_texts.split(',').each do |id|
  post_text = PostText.where(post_text_id: id)
  @titles = post_text.where(placement: 'title')
  @descriptions = banner_text.where(placement: 'description')
end

@languages.split(',').sort { |a,b| a.lang <=> b.lang }.each do |lang|
  @bodies  = @titles.where(language: lang)
  @ctas    = @descriptions.where(language: lang)
end

@titles.each do |title|
  @descriptions.each do |description|
    Post.create(
        title: title.body,
        description: description.body,
        language: 'language here',
    )
  end
end

2

@languages = params[:languages].split(',')
@post_texts = params[:post_texts].split(',')
@post_texts.split(',').each do |id|
  post_text = PostText.where(post_text_id: id)
  @titles = post_text.where(placement: 'title')
  @descriptions = banner_text.where(placement: 'description')
end

@languages.split(',').map { |lang|
  @bodies  = @titles.where(language: lang)
  @ctas    = @descriptions.where(language: lang)
end

@titles.each do |title|
  @descriptions.each do |description|
    Post.create(
        title: title.body,
        description: description.body,
        language: 'language here',
    )
  end
end

Любая помощь приветствуется и спасибо заранее!

1 Ответ

0 голосов
/ 28 января 2019

Чтобы получить желаемые результаты, вам нужно указать его в своем последнем loop, где вы создаете свои записи, выполнив .where(field: loop.value), что в вашем случае будет where(language: title.language) и то же самое с вашимpost_text переменная.

Shange

post_text = PostText.where(post_text_id: id)

To:

post_text = PostText.where(post_text_id: id).where(language: lang)

Код будет выглядеть следующим образом:

@languages = params[:languages].split(',')
@post_texts = params[:post_texts].split(',')
@post_texts.split(',').each do |id|
  @languages.split(',').each do |lang|
    post_text = PostText.where(post_text_id: id).where(language: lang)
    @titles = post_text.where(placement: 'title')
    @descriptions = banner_text.where(placement: 'description')
  end
end

@titles.each do |title|
  @descriptions.where(language: title.language).each do |description|
    Post.create(
        title: title.body,
        description: description.body,
        language: 'language here',
    )
  end
end

Основнойдеталь, которая была изменена, это @descriptions.each do |description|, изменив ее на @descriptions.each do |description|

...