Ruby on Rails 4 - 对 .each 中的记录进行排序并创建记录

Ruby on Rails 4 - sort records in .each and create records

在我的应用程序中,我有 2 个模型 PostPostTexts

每个 Postlanguagepositiontitledescription

位置是:标题和描述

简要介绍一下我的申请,以便更好地理解。用户进来 selects languages & 他们想要的文本,将得到他们可以使用的不同 post 文本的结果。

例如用户selects:

语言:英语、西班牙语

目前我正在创建文本:

@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

如果我只有 select 1 种语言,这会很好用,结果如下:

Title 1 + Description 1
Title 2 + Description 1

但是当我 select 多种语言时,文本 会混淆,西班牙语文本会与英语混淆,反之亦然。

我想要实现的是,当几种语言都被 selected 时,只有英语文本与英语和西班牙语文本一起与西班牙语等

所以结果将是:

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:如果描述的不是很好请见谅

我也用两种不同的方式进行了测试,但结果是一样的:

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

感谢任何帮助,并提前致谢!

为了获得您想要的结果,您需要在创建记录的最后 loop 中指定它,方法是 .where(field: loop.value),在您的情况下是 where(language: title.language) 和你的 post_text 变量一样。

刷歌

post_text = PostText.where(post_text_id: id)

收件人:

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|