gpt4 book ai didi

mysql - 高效查询多语言类别和类别项

转载 作者:行者123 更新时间:2023-11-29 22:00:18 27 4
gpt4 key购买 nike

所以我遇到了一些服务器响应时间问题 - 我认为这是由于过时的查询引起的。我的一个主要查询链需要长达 370 毫秒的时间,这显然会导致问题。

以下是要求:

  1. 5 种不同的语言
  2. 有多个产品类别(即类别 1、类别 2、类别 3 等)
  3. 显示的类别取决于语言。例如,类别 1 以所有语言显示,而类别 2 仅在德国和法国显示,但在英国不显示
  4. 每个类别包含 x 个项目(有多个属于关系)。同样,有些项目以某些语言显示,而另一些则不然。例如,即使类别 2 在法国和德国显示,但只有在德国您才能购买商品 1,因此商品 1 不应在法国显示,而应在德国显示。
  5. 类别和项目确实具有以区域设置命名的 bool 字段。这样我可以通过标志设置是否以特定语言显示类别和项目。

我的解决方案:

构建解决方案非常简单。在 Controller 中,我读出当前区域设置的所有类别:

application_controller.rb(因为它在每个页面上都使用)

<小时/>
@product_categories = ProductCategory.where("lang_" + I18n.locale.to_s + " = ?", true)
<小时/>

在 View (导航)中我执行以下操作:

layouts/navs/productnav.html.haml

<小时/>
- @product_categories.each do |category|
...
- category.products.includes(:product_teasers).where("lang_" + I18n.locale.to_s + " = ? AND active = ?", true, true).in_groups_of(3).each do |group|
...
<小时/>

此解决方案的问题是每次我都会向数据库发出大量查询。使用“包含”并不能解决这个问题,因为我无法指定要拉取哪些项目。此外,我需要循环中的 in_groups_of(3) 才能在页面上正确显示项目。

我还在研究 memchached 解决方案,将查询全部缓存在一起 - 即 Dalli但是,这将需要我更改大量代码,因为我猜测我需要查询每种语言的所有类别并缓存它们。除此之外,我还必须根据语言查询每种语言的每个项目,并将其以某种方式存储在数组中?!

我的问题:

如何解决这个问题?必须有一个更简单、更有效的解决方案。如何有效地查询分别缓存这个?

谢谢!

更新:

根据要求,这是我的两个模型:

1.) 产品类别

class ProductCategory < ActiveRecord::Base
translates :name, :description, :slug, :meta_keywords, :meta_description, :meta_title, :header, :teaser, :fallbacks_for_empty_translations => true
extend FriendlyId
friendly_id :name, :use => [:globalize, :slugged]
globalize_accessors :locales => [:at, :de, :ch_de, :ch_fr, :fr, :int_en, :int_fr], :attributes => [:slug]

has_paper_trail
has_many :products, :dependent => :destroy

validates :name, presence: true, uniqueness: { case_sensitive: false }
default_scope { includes(:translations) }

private
def slug_candidates
[
[:name]
]
end
end

2.) 产品每个产品类别可以有 0..n 个产品,并且每个产品必须属于一个类别。

class Product < ActiveRecord::Base
translates :slug, :name, :meta_keywords, :meta_description, :meta_title, :teaser, :power_range, :product_page_teaser, :product_category_slider_teaser, :fallbacks_for_empty_translations => true
extend FriendlyId
friendly_id :name, :use => :globalize

before_save :change_file_name

searchable do
text :name, :teaser, :product_page_teaser, :product_category_slider_teaser
integer :product_category_id
end

belongs_to :product_category
has_many :product_teasers, :dependent => :destroy
has_many :product_videos, :dependent => :destroy
has_many :product_banners, :dependent => :destroy
has_many :product_documents, :dependent => :destroy
has_many :product_tabs, :dependent => :destroy
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy
has_many :passive_relationships, class_name: "Relationship",
foreign_key: "followed_id",
dependent: :destroy
has_many :following, through: :active_relationships, source: :followed
has_many :followers, through: :passive_relationships, source: :follower
has_many :references

has_and_belongs_to_many :contacts

accepts_nested_attributes_for :product_teasers, :reject_if => :all_blank, :allow_destroy => true
accepts_nested_attributes_for :product_tabs, :reject_if => :all_blank, :allow_destroy => true
accepts_nested_attributes_for :product_videos, :reject_if => :all_blank, :allow_destroy => true
accepts_nested_attributes_for :product_banners, :reject_if => :all_blank, :allow_destroy => true
accepts_nested_attributes_for :product_documents, :reject_if => :all_blank, :allow_destroy => true

has_paper_trail
validates :name, presence: true, uniqueness: { case_sensitive: false }
default_scope {includes(:translations)}

.... a lot more going on here ...

end

请注意:该类别包含语言标志( bool 值),即 lang_at、lang_de、lang_fr 等,如果设置,则该类别将以该特定语言显示。同样适用于产品,因为某些产品不会以所有语言显示,尽管该类别可能会以所有语言显示。

示例:

@product_categories = ProductCategory.where("product_categories.lang_" + I18n.locale.to_s + " = ?", true)

@products = Product.where("product_categories.lang_" + I18n.locale.to_s + " = ?", true)

我故意跳过了上面的任何包含内容 - 这只是为了演示语言逻辑。

最佳答案

更新

系统花费了大量时间在嵌套循环中循环数据。避免在嵌套循环中获取数据。您必须使用联接或包含来更有效地捕获数据。例如:

Controller

@products = Product.includes(:product_category).where("product_categories.lang_" + I18n.locale.to_s + " = ? AND product_categories.active = ?", true, true).group_by(&:category)

查看

- @products.each do |category, products|
<%= category.name %>
- products.each do |product|
<%= product.title %>

它需要用您必要的代码进行修复。我只是帮助主要查询。例如:active = ? 用于产品字段或product_categories 字段。希望对您有帮助。

关于mysql - 高效查询多语言类别和类别项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725484/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com