2

Product モデルでシリアル化された列を次のように使用しています。

class Image < ActiveRecord::Base
   attr_accessible :id, :created_at, :updated_at, :price
   serialize :price
end

シリアル化された列の場合と同様に、価格列がテキスト列として追加されます。価格属性には、さらに 2 つの属性「値」と「通貨」があり、次のようにデータベースに保存されます。

#<Product id: 1482, price: {:value=>"500", :currency=>"INR"}, created_at: "2013-05-30 14:35:17", updated_at: "2013-05-30 14:35:22">

ここで、価格が 200 ドルを超える製品の数を取得したいので、アクティブ レコード クエリを次のように記述します。

Product.where('price[:value] > ?', 200).count

しかし、それは私にエラーを与えます:

 ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[:value] is not null)' at line 1: SELECT `products`.* FROM `products`  WHERE (price[:value] is > 200)  

where句でシリアル化された属性にアクセスする方法が見つかりません。

4

1 に答える 1

0

列はシリアル化されているため、その内部は Ruby コードです。つまり、この列を "フィルター処理" するには Ruby が必要です。データベース内の製品番号によっては、アプリがこの命令を実行するのに時間がかかる場合があることを知っておくことが重要です。

Product.scoped.select{ |p| p.price[:value] > 200 }.count

Product.scopedに似ていProduct.allます。p.price[:value]に変換する必要がある場合がありますint(DB では文字列のようです)。

于 2013-06-03T14:21:18.783 に答える