:condition con tabla intermedia

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 :wink:

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?