Hola Eduardo!

Yo lo haría distinto. En vez de programar "a mano" la relación entre
translations y subtranslations, usaría acts_as_nested_set o
BetterNestedSet.

http://api.rubyonrails.org/classes/ActiveRecord/Acts/NestedSet/ClassMethods.html

Si preveo bien el sistema que estás queriendo hacer, creo que no te va
a interesar más de 1 nivel de subtraducciones, así que tanto
acts_as_nested_set como BetterNestedSet pueden sonar a too much...
pero tu solución tampoco limita a 1 nivel, así que aplican igual.

class Sentence < ActiveRecord::Base
  has_many :translations
end

class Translation < ActiveRecord::Base
  belongs_to :sentence
  acts_as_nested_set :scope => :sentence
end

class CreateTranslations < ActiveRecord::Migration
  def self.up
    create_table :translations do |t|
        t.column :name, :string
        t.column :sentence_id, :integer
        t.column :parent_id, :integer
        t.column :lft, :integer
        t.column :rgt, :integer
    end
  end

  def self.down
    drop_table :translations
  end
end

Además... la búsqueda yo la haría desde Sentence, y no desde
Translation. Porque de última lo que vos querés filtrar son las
Sentence (oraciones) y si usás include se te van a precargar y podrás
recorrerlas con sentence.translations.each sin costo de base de datos.

@sentences = Sentence.find(:all, :include => :translations,
:conditions => ['sentences.name LIKE ?', '%cierto texto%'])

¿Qué tal eso?

DISCLAIMER: Lo escribí directo en el mail, no lo probé.

-Diego

2008/3/23 Eduardo Trápani <[EMAIL PROTECTED]>:
> Hola,
>
>  Tengo Traducciones y Oraciones.  Los originales también son
>  traducciones, así que hay un campo que engancha el original si es una
>  traducción (subtranslations).  El texto está en las Oraciones.
>
>  class Sentence < ActiveRecord::Base
>  has_many :translations
>  end
>
>  class Translation < ActiveRecord::Base
>  belongs_to :sentence
>  has_many :subtranslations, :class_name => 'Translation', :foreign_key =>
>  'translation_id'
>  end
>
>  Al cargar las traducciones, incluyendo las oraciones, quiero sólo las
>  oraciones que tengan un cierto texto.
>
>  @t = Translation.find(:all,:include =>
>  
> [:sentence,{:subtranslations=>[:sentence]}],:conditions=>['sentences_subtranslations.name
>  like ?','%cierto texto%'])
>
>  ¡Pero no funciona!
>
>  Lo que sí funciona es hacer:
>
>  @t = Translation.find(:all,:include =>
>  
> [:sentence,{:subtranslations=>[:sentence]}],:conditions=>['sentences_translations.name
>  like ?','%cierto texto%'])
>
>  Es decir, usando 'sentences_translations' en lugar de
>  'sentences_subtranslations' que es el nombre real de la relación.  No
>  está bien, ¿no?  No sé si será un bug ...
>
>  Pongo abajo el controlador y la migración y el rhtml (los modelos están
>  arriba) por si alguien quiere probarlo.  Es bien cortito.  Probé
>  bastante, porque no encontraba en ningún lado cómo hacer referencia en
>  :conditions a campos de :include anidados.  Ni siquiera estoy seguro de
>  que sea así, pero bueno, por lo menos ahora parece andar.
>
>  Eduardo.
>
>
>  class TranslatorController < ApplicationController
>     def index
>         s_es = Sentence.find_or_create_by_name('hola mundo')
>         s_en = Sentence.find_or_create_by_name('hello world')
>         t_es =
>  Translation.find_or_create_by_sentence_id_and_translation_id(s_es.id,nil)
>         t_en =
>  Translation.find_or_create_by_sentence_id_and_translation_id(s_en.id,t_es.id)
>
>         # ANDA
>         @t = Translation.find(:all,:include =>
>  
> [:sentence,{:subtranslations=>[:sentence]}],:conditions=>['sentences_translations.name
>         like ?','h%'])
>
>         # NO ANDAN
>         [EMAIL PROTECTED] = Translation.find(:all,:include =>
>  
> [:sentence,{:subtranslations=>[:sentence]}],:conditions=>['subtranslations.sentences.name
>  like ?','h%'])
>         [EMAIL PROTECTED] = Translation.find(:all,:include =>
>  
> [:sentence,{:subtranslations=>[:sentence]}],:conditions=>['subtranslations.sentence.name
>  like ?','h%'])
>         [EMAIL PROTECTED] = Translation.find(:all,:include =>
>  
> [:sentence,{:subtranslations=>[:sentence]}],:conditions=>['sentences_subtranslations.name
>  like ?','h%'])
>     end
>  end
>
>  # Migraciones
>  class CreateTranslations < ActiveRecord::Migration
>    def self.up
>      create_table :translations do |t|
>          t.column :name, :string
>          t.column :sentence_id, :integer
>          t.column :translation_id, :integer
>      end
>    end
>
>    def self.down
>      drop_table :translations
>    end
>  end
>
>  class CreateSentences < ActiveRecord::Migration
>    def self.up
>      create_table :sentences do |t|
>          t.column :name, :string
>          t.column :sentence_id, :integer
>      end
>    end
>
>    def self.down
>      drop_table :sentences
>    end
>  end
>
>  # index.rhtml de la vista (debería poner 1/hola mundo/hello world en
>  líneas separadas
>
>  <%= @t.size %>
>  <br>
>  <%= @t[0].sentence.name %>
>  <br>
>  <%= @t[0].subtranslations[0].sentence.name %>
>  _______________________________________________
>  Ruby mailing list
>  [email protected]
>  http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>



-- 
Diego Algorta Casamayou
http://www.oboxodo.com - http://diego.algorta.net
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a