2017-11-11 175 views
0

我试图解决一个问题。Activerecord与多个字符串作为键的关系

我有一个包含大约10.000条记录的产品模型。这些记录来自一些在线商家供稿,并且属性之间有category_name

#<Offer id: 1, external_id: "[\"000002151\", \"Caffettiera Bialetti Dama nuova 1 t...", provider_id: 1, product_title: "Caffettiera Bialetti Dama nuova 1 tazza", product_description: "Ricarica caffè: Caffè macinato; Tipologia: Caffett...", external_model: "DAMA NUOVA", sku: "000002151", mpn: "0002151", ean: "8006363021517", category_code: "MFF", category_name: "Macchine da caffè"> 

的问题是,类别名称是不是每个mercant独特:一个商人的彩电品类是一个简单的“LED电视”,另一个是“LCD电视”。

在我的仪表板中,我需要筛选一个类别,因此我创建了一个类别模型。我有十大类,每一个“宏观”的类别包括很多category_name

基本上我的类别迁移

create_table :categories do |t| 
    t.string :name, null: false 
    t.text :subcategories, array: true, default: [] 
end 

TV & Monitor类别都有一个子类别属性,它是一个数组,数组里面我有外部商户为电视定义的各类分类。

['OLED TV', 'LCD TV', 'TV', ...] 

如果我使用

Product.where(category_name: category.subcategory) 

irb(main):005:0> Offer.where(category_name: ["Mini Micro Hi Fi e boombox", "Radio", "Sbattitori"]) 
    Offer Load (2.2ms) SELECT "offers".* FROM "offers" WHERE "offers"."category_name" IN ('Mini Micro Hi Fi e boombox', 'Radio', 'Sbattitori') LIMIT $1 [["LIMIT", 11]] 

查询返回我的所有产品。但是我想创建一个关系,我希望category.products可以将category_name包含在我的subcategories阵列中的所有产品返回给我。

我该怎么办?

+0

你可以复制得到'Product.where(CATEGORY_NAME:category.subcategory)你的SQL查询'? – AntonTkachov

+0

@AntonTkachov添加了查询,型号名称为Offer而非Product –

回答

0

这里是大多应该为你工作守则,但我没有测试它在我自己的

has_many :products, :finder_sql => "SELECT * FROM product WHERE category_name IN (#{subcategories.map{ |category_name| "\'#{category_name}\'" }.join(', ')})" 

PS:说实话,我不喜欢你的方法在所有。每当我看到数据库中的复杂字段(object/hash/array)时,它通常会变得非常糟糕......

我建议你去产品和类别之间进行一些真正的关联。现在你有类别名称重复,看起来非常丑陋。我会将我的categories作为tree管理,其parent与另一类别关联,如果它是“宏类别”,则为空。并且产品将有平均category_id

在这种情况下,您Category将有has_many childrenhas_many :product, through: :children

+0

谢谢你。我想用YML文件或常量创建类别模型。基本上是商家类别和我的类别之间的地图。我不能有真正的关联,类别是字符串,我没有任何控制饲料。所以我们需要手动添加字符串到我们的类别“数组” –

+0

是的,我明白你的意思。我建议你 - '没有'parent_id'的类别是你的分类。您添加的所有Feed类别都与另一个类别(其中包含“parent_id”)设置为您的类别(如“TV&Monitor”)一样。他们将是你的类别的孩子。所有产品都会拥有来自Feed的“类别”category_id。在它上面调用'parent'会给你真正的'Category'。你明白我的意思吗? – AntonTkachov

+0

所以你把你的'子类别'数组转换成子类''(树结构) – AntonTkachov

相关问题