2017-11-11 87 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