Buenas, tengo un pequeño problema, a ver si alguien me puede echar una
mano:
Digamos que tengo que hacer una busqueda con condiciones que serÃa de la
siguiente forma:
<% @base = Player.find(:first, :conditions => [‘team_id = ? and
position_id =?’, @team.id, 1] )%>
O sea, busco el jugador que pertenece al equipo actual i que además
ocupa la posicion con id = 1. Hasta aquà ningun problema, el problema
está en que el campo team_id no se encuantra en la tabla players, sino
en una tabla intermedia que se llama players_teams y que contiene los
campos team_id i player_id. Ya que entre ambos existe una relación n a
n.
Como puedo decirle a las condiciones que no me busque el campo “team_id”
en la tabla “players” sino en la tabla intermedia? (players_teams).
On 8/10/07, David R. [email protected] wrote:
está en que el campo team_id no se encuantra en la tabla players, sino
en una tabla intermedia que se llama players_teams y que contiene los
campos team_id i player_id. Ya que entre ambos existe una relación n a
n.
Como puedo decirle a las condiciones que no me busque el campo “team_id”
en la tabla “players” sino en la tabla intermedia? (players_teams).
Player.find(:first, :include => :teams, :conditions => {:team_id =>
@team.id, :position_id => 1)
Y mejor todavía:
@base = @team.players.find_by_position_id(1)
Player.find(:first, :include => :teams, :conditions => {:team_id =>
@team.id, :position_id => 1)
Y mejor todav�a:
@base = @team.players.find_by_position_id(1)
Ok, muchas grácias!!! No deja de sorprenderme lo senzillas que son las
cosas con Rails (cuando las conoces).
Ahora sólo tengo otro problema. Existen dos jugadores para cada posición
y necessito listar primero uno y luego el otro. Pero si hago:
@base = @team.players.find_by_position_id(1)
Me aparece siempre el primer resultado. Como hago para listar primero
uno y después el otro?
Muchas grácias!!
On 8/10/07, David R. [email protected] wrote:
Ahora sólo tengo otro problema. Existen dos jugadores para cada posición
y necessito listar primero uno y luego el otro. Pero si hago:
@base = @team.players.find_by_position_id(1)
Me aparece siempre el primer resultado. Como hago para listar primero
uno y después el otro?
@bases = @team.players.find_all_by_position_id(1)
@bases es un Array con tantos objetos Player como hayas recibido de la
BD…
También podrías pasar este método al modelo de datos, para
eventualmente aplicar alguna regla de negocio más:
class Player < AR::Base
Devuelve los primeros dos jugadores en la posición dada.
def self.at_position(p)
find(:all, :conditions => {:position_id => p.to_i}, :limit => 2)
end
end
Este método ya es un poco más inteligente: se ocupa de llamar al
método #to_i en el parámetro que recibe (duck typing, recibimos
cualquier cosa que responda a #to_i), y pone el límite en dos para
devolver sólo los primeros dos jugadores (es una optimización para la
BD y también por si la BD está corrompida y te quedaron 3 jugadores
para una misma posición).
Uso:
@players = Player.at_position(1)
@bases = @team.players.at_position(1)
Saludos!
Ok, he encontrado el fallo:
antes hacÃa:
@base = @team.players.find_by_position_id(1)
y sólo me devolvÃa 1 resultado.
lo he cambiado por:
@base = @team.players.find_all_by_position_id(1)
y ahora ya puedo acceder a los dos resultados con:
@base[0].name
@base[1].name
Muchas grácias por tu ayuda!
Me aparece siempre el primer resultado. Como hago para listar primero
uno y despu�s el otro?
@bases = @team.players.find_all_by_position_id(1)
@bases es un Array con tantos objetos Player como hayas recibido de la
BD…
Buff, debo estar saturado ya pero no sé como acceder a los datos del
array para que me muestre el segundo resultado.
He probado algo como esto:
<%= @base[1].name %>
pero es evidente que algo estoy haciendo mal porque me devuelve un
objeto vacÃo y da error…
He tratado de buscar documentacion acerca de como hacerlo pero solo he
conseguido liarme más aún…
Grácias por el tema del método, pero lo veo un poco complicado aún para
mi… jejej
On 8/10/07, David R. [email protected] wrote:
@base = @team.players.find_all_by_position_id(1)
y ahora ya puedo acceder a los dos resultados con:
@base[0].name
@base[1].name
Muchas grácias por tu ayuda!
De nada 
On 8/10/07, David R. [email protected] wrote:
array para que me muestre el segundo resultado.
He probado algo como esto:
<%= @base[1].name %>
¿La variable se llama @base o @bases?
<% @bases.each do |base| %>
<%= base.name %>
<% end %>
¿Ahora?