2011-02-21 1 views
2

Environnement: Ruby 1.9.2, Rails 3.0.1Rails: "séquence d'octets invalide en UTF-8" exception lors de la création d'une association has_one par UUID

Deux tables MySQL: 1. articles, 2. vote_counts (chaque ligne représente le nombre d'utilisateurs ayant voté sur un élément)

Étant donné que les tables sont volumineuses et que j'ai besoin de les partitionner, j'utilise des UUID. La colonne uuid est définie dans les deux tables: uuid varbinary (16) NOT NULL.

I définit une association has_one dans le modèle d'article: has_one: vote_count,: foreign_key => "uuid",: primary_key => "UUID"

Quand j'appelle item.vote_count, je reçois l'exception suivante sur certaines valeurs UUID: "ArgumentError: séquence d'octets invalide en UTF-8".

Bien sûr, l'UUID brut est juste une séquence d'octets (Encoding: ASCII-8BIT), mais lorsque ActiveRecord construit une requête SQL, il essaie de l'interpréter comme une chaîne UTF-8.

Comment puis-je lui dire de simplement passer la séquence d'octets à MySQL?

+0

quel pilote MySQL (et quelle version) utilisez-vous? Quel encodage MySQL a-t-il pour la colonne en question? –

+0

Pilote: mysql2 ver 0.2.6 –

+0

La table a un encodage utf8, mais est-ce important pour une colonne varbinary? –

Répondre

1

Utilisez-vous quelque chose comme

UUIDTools::UUID.random_create.hexdigest[0, 8] 

pour générer l'UUID?

Nous utilisons ceci et nous l'assignons à un champ de chaîne dans nos modèles en utilisant à la fois les DBs mysql et postgres. note: nous ne les utilisons pas en tant que clés. Tout comme les champs réguliers dans le modèle.

+1

Si vous stockez des UUID dans une colonne de chaîne dans la base de données, ce problème n'est pas un problème, mais les stocker de cette manière est une perte d'espace significative par rapport à un varbinary (16). –

Questions connexes