Ruby on Rails 4 - 对 .each 中的记录进行排序并创建记录
Ruby on Rails 4 - sort records in .each and create records
在我的应用程序中,我有 2 个模型 Post
和 PostTexts
。
每个 Post
有 language
、position
、title
和 description
。
位置是:标题和描述。
简要介绍一下我的申请,以便更好地理解。用户进来 selects languages
& 他们想要的文本,将得到他们可以使用的不同 post 文本的结果。
例如用户selects:
- 标题 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
如果我只有 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|
在我的应用程序中,我有 2 个模型 Post
和 PostTexts
。
每个 Post
有 language
、position
、title
和 description
。
位置是:标题和描述。
简要介绍一下我的申请,以便更好地理解。用户进来 selects languages
& 他们想要的文本,将得到他们可以使用的不同 post 文本的结果。
例如用户selects:
- 标题 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
如果我只有 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|