Ruby Forum Rails France > find ou find_by_sql : SELECT * et plus...

Posted by Chris Gers32 (gers32)
on 22.02.2008 11:07
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.
Posted by Baptiste Decroix (Guest)
on 22.02.2008 13:35
(Received via mailing list)
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 <list-incoming@andreas-s.net> wrote:
>
>
>  >
>


--
Baptiste
Posted by gers32 (Guest)
on 25.02.2008 10:17
(Received via mailing list)
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.
Posted by Jean-François Trân (Guest)
on 25.02.2008 12:26
(Received via mailing list)
Le 25/02/08, gers32<cbu.kitry@gmail.com> 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
http://www.polldaddy.com/s/7BAC374D75039925/ ? :)

   -- Jean-François.

--
Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org 
)
Posted by Chris Gers32 (gers32)
on 27.02.2008 11:23
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.
Posted by Chris Gers32 (gers32)
on 27.02.2008 12:06
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.
Posted by Chris Gers32 (gers32)
on 29.02.2008 16:13
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.