Find ou find_by_sql : SELECT * et plus

Bonjour,

J’essaie de récupérer TOUS les champs d’une table (qui en contient
beaucoup !), ainsi qu’un sous-ensemble de ces mêmes champs que je vais
renommer (pour des questions d’i18n).

Ceci équivaudrait à la requête SQL suivante :

SELECT *, NAME_FR AS NAME, DESC_FR AS DESCRIPTION FROM MATABLE;

Le problème est que cette requête est erronée (seulement dans Oracle ?).
Y a-t-il un moyen d’effectuer cette requête via la fonction find de
Rails ?

Merci,

Christophe.

Bonjour

Le problème c’est que la fonction find ne te renvoie pas une liste de
valeurs, mais utilise ces valeurs pour initialiser ton modèle.
Pour faire ce que tu veux, tu peux:
-rajouter dans ton modèle des méthodes du genre:
def name
self[:name_fr]
end
def description
self[:desc_fr]
end
-ou bien si tu veux vraiment obtenir une liste des valeurs, sans
objets instanciés par rails, tu peux utiliser ActiveRecord:
sql = MonModele.send(:construct_finder_sql, :select => “*, NAME_FR AS
NAME, DESC_FR AS DESCRIPTION”)
r = ActiveRecord::Base.connection.select_all(sql)

On 22/02/2008, Chris Gers32 [email protected] wrote:


Baptiste

Bonjour Baptiste,

Ta première solution est exactement ce qu’il me faut, car je récupère
un objet qui est ensuite transformé en XML.

J’ai donc créé la méthode suivante dans le modèle :

def description
self[:desc_fr]
end

et dans le contrôleur, j’ai :

def by_id_xml
@mon_modele = MonModele.find( params[:id] )
render :xml => @mon_modele.to_xml
end

Malheureusement, la méthode by_id_xml renvoie toujours la même
structure XML, avec tous les champs de la table, mais sans le nouveau
champ “description”… Est-ce dû au fait que description soit une
méthode et non un champ ? Et dans ce cas, y a-t-il un moyen de dire à
ActiveRecord d’ajouter ce champ à son modèle ? La question est peut-
être basique, mais je débute Rails…

Merci,

Christophe.

Merci Jean-François, ça marche.

Oui, j’ai répondu au sondage. Le Bar Camp m’intéresserait mais
malheureusement, je vis dans le Gers et avec deux filles en bas âge,
tout déplacement devient une expédition ! En revanche, quelque chose
près de Toulouse ou Bordeaux… Y a-t-il une communauté RoR dans le
Sud-Ouest ?

Christophe.

Maintenant je fais face à un problème dérivé de celui ci-dessus… Mon
code Rails est le suivant :

##########################

@mes_donnees = MaTable.find(
:all,
:select => “ID, CODE, DESC_FR AS DESCRIPTION_I18N”,
:conditions => conditions_list)
@mes_donnees_i18n = @mes_donnees.to_xml :methods => [:description_i18n]
render :xml => @mes_donnees_i18n

##########################

La structure XML que je récupère ne contient pas de valeur pour le champ
DESCRIPTION_I18N, alors que si je supprime le :select, j’ai la bonne
valeur…

Malheureusement, j’ai un grand nombre de champs dans cette table et dois
restreindre le nombre de ceux que je récupère.

Est-ce que le contenu de mon :select (notamment le AS) est erroné ?

Merci,

Christophe.

Le 25/02/08, gers32[email protected] a écrit :

render :xml => @mon_modele.to_xml

end

Malheureusement, la méthode by_id_xml renvoie toujours
la même structure XML, avec tous les champs de la table,
mais sans le nouveau champ “description”… Est-ce dû au fait
que description soit une méthode et non un champ ? Et dans ce
cas, y a-t-il un moyen de dire à ActiveRecord d’ajouter ce champ
à son modèle ?

Tu as l’option :methods.

@mon_modele.to_xml, :methods => [ :description ]

La question est peut-être basique, mais je débute Rails…

(Au fait, t’as répondu à mon sondage sur le BarCamp Rails parisien
Sondage BarCamp Rails à Paris | Crowdsignal.com ? :slight_smile:

– Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Mon problème est résolu : il ne fallait pas créer la variable
DESCRIPTION_I18N dans la requête SQL, puisqu’elle est créée dans le
to_xml() qui s’attend par contre à trouver DESC_FR dans le résultat de
la requête. J’ai donc supprimé “AS DESCRIPTION_I18N” et ça marche !

Merci Fred du forum “Ruby on Rails”.

Christophe.