Joins implicite

Ciao a tutti,
ho il seguente problema

C L A S S I

class Quotation
has_many: fases
end

class Fase
belongs_to: quotation
end

nella tabella quotations c’è il campo fase_id.

la tabella fases è costituita da due campi:
id
descrizione

P R O B L E M A
quando vado a visualizzare il contenuto di quotations vorrei
visualizzare invece che quotation.fase_id (che è un numero)

quotation.fase.descrizione

ma rails mi dice che: “fase, undefined method”.

Cosa devo mettere nel controller di quotation per ottenere la
descrizione di fase ?

Un grazie a tutti, ciao

2010/11/3 An Car [email protected]:

class Quotation
has_many: fases
end

class Fase
belongs_to: quotation
end

nella tabella quotations c’ il campo fase_id.

non dovrebbe invece esserci quotation_id in fase?

P R O B L E M A
quando vado a visualizzare il contenuto di quotations vorrei
visualizzare invece che quotation.fase_id (che un numero)

quotation.fase.descrizione

ma rails mi dice che: “fase, undefined method”.

si perch quotation has_many: fases

er

forse ci sono un po’ di errori di impostazione

  • se Quotation “has_many” Fases, perch il campo ‘fase_id’ nella
    tabella quotations? semmai dovrebbe essere la tabella ‘fases’ ad avere
    un campo ‘quotation_id’. Oppure devi invertire la dichiarazione nelle
    due classi e dire:

‘Quotation belongs_to Fase’ e ‘Fase has_many Quotations’

quindi tutto dipende da cosa devi fare :stuck_out_tongue:

  • in ogni caso, se Fase ‘has_many’ Quotations, allora dovrai scrivere:

quotation.fase # Quotation ha un Fase di riferimento

fase.quotations # Fase ha un array di Quotations

spero ti sia pi chiaro :wink:

A.

Il 03/11/2010 18:46, An Car ha scritto:

2010/11/4 An Car [email protected]:

Mi s che ho esposto la cosa in modo confuso.

In realt la tabella fases una tabella di “appoggio” ovvero contiene i
5 passaggi che un quotation (budget preventivo) deve avere.
Ricapitolando:
un quotation deve necessariamente avere 5 fases

quindi quotation ha 5 fases… e se non ho capito male la tabella fases
contiene 5 record in tutto giusto? quindi non molti-a-molti.

quindi in teoria con i modelli che hai scritto tu:
q= Quotation.where…
q.fases # dovrebbe contenere un’array di 5 fasi

non che le fasi sono gli stati di una quotation? in quel caso dai
un’occhiata a http://slagyr.github.com/statemachine/

cheers
ER

buon giorno a tutti.
io ho lo stesso problema ma su una relazione molti a molti…

ho la tabella users e la tabella posts (relazione n:m) collegati tra
loro con una tabella di join chiamata relations.

nel model user ho scritto:
has_many :relations
has_many :posts , :through => :relations

nel modello post:
has_many :relations
has_many :users , :through => :relations

nel modello relation:
belongs_to :post
belongs_to :user

la tab relations ha al suo interno user_id e post_id.

quando va ad eseguire questo metodo scritto nel modello post:

def Post.find_user_per_post(arg)
po=Post.find(:all,:conditions=>[“category=?”,arg])
@posts=po.users
end

mi da errore e dice che non esiste un metodo ‘users’ per l array
ritornato!!
Sono alle prime armi con rails e questa è un applicazioncina di prova
per avere un po di dimestichezza con il db, quindi chiedo a voi esperti.

ps.: ho provato sia con mysql che con sqllite3 credendo che fosse un
problema di db ma purtroppo la situazione è sempre la stessa…

2010/11/18 Federico L. [email protected]:

def Post.find_user_per_post(arg)
po=Post.find(:all,:conditions=>[“category=?”,arg])
@posts=po.users
end

mi da errore e dice che non esiste un metodo ‘users’ per l array
ritornato!!

Appunto. find :all torna un array! il fatto che esista il metodo
.users per i singoli membri dell’array non vuol dire che esista per
l’array stesso, anzi in genere non e’ cosi’, come puoi chiedere il
nome a una persona ma non a una fila di persone :wink:

Ovvero, potresti fare:

@posters = po.map { |p| p.users }.flatten.uniq

(ovvero raccogliere gli utenti dei vari post trovati in un array di
array, renderlo un unico array unidimensionale, e poi eliminare i
duplicati.

A dire il vero, a prescindere dal problema da te riscontrato, noto due
o tre cose strane:

  1. chiami il metodo Post.find_user_per_post(arg) ma con ogni evidenza
    il parametro e’ una category, e trova utenti che hanno postato in
    quella category… ovvero non converrebbe chiamarlo
    all_posters_for_category??
  2. quando assegni alla variabile di istanza, dici posts = po.users…
    avere una variabile che si chiama “pere” e metterci dentro delle mele
    e’ una ricetta per il disastro!
  3. Non e’ chiaro neanche a me quale sia il comportamento usando una
    instance variabile (quelle con una @) dentro un metodo di classe, ma
    penso non faccia quello che vuoi tu.

Saluti!

Appunto. find :all torna un array! il fatto che esista il metodo
.users per i singoli membri dell’array non vuol dire che esista per
l’array stesso, anzi in genere non e’ cosi’, come puoi chiedere il
nome a una persona ma non a una fila di persone :wink:

GRAZIE! non ci avevo proprio pensato! ora che me l hai fatto notare è un
po strano quello che ho scritto…

  1. chiami il metodo Post.find_user_per_post(arg) ma con ogni evidenza
    il parametro e’ una category, e trova utenti che hanno postato in
    quella category… ovvero non converrebbe chiamarlo
    all_posters_for_category??
  2. quando assegni alla variabile di istanza, dici posts = po.users…
    avere una variabile che si chiama “pere” e metterci dentro delle mele
    e’ una ricetta per il disastro!
  3. Non e’ chiaro neanche a me quale sia il comportamento usando una
    instance variabile (quelle con una @) dentro un metodo di classe, ma
    penso non faccia quello che vuoi tu.

si lo so e mi scuso…i nomi delle variabili e dei metodi non sono molto
appropriati(oserei dire che fanno riferimento a tutt altro!) ma a furia
di cambiare e ricambiare il codice ho fatto un pasticcio unico!

comunque grazie mille delle delucidazioni. ora va tutto come deve andare
:wink: (ovviamente riscriverò la mini-applicazione in modo meno
confusionario.

Andrea P. wrote in post #959088:

forse ci sono un po’ di errori di impostazione

  • se Quotation “has_many” Fases, perch il campo ‘fase_id’ nella
    tabella quotations? semmai dovrebbe essere la tabella ‘fases’ ad avere
    un campo ‘quotation_id’. Oppure devi invertire la dichiarazione nelle
    due classi e dire:

‘Quotation belongs_to Fase’ e ‘Fase has_many Quotations’

quindi tutto dipende da cosa devi fare :stuck_out_tongue:

  • in ogni caso, se Fase ‘has_many’ Quotations, allora dovrai scrivere:

quotation.fase # Quotation ha un Fase di riferimento

fase.quotations # Fase ha un array di Quotations

spero ti sia pi chiaro :wink:

A.

Il 03/11/2010 18:46, An Car ha scritto:

Mi sà che ho esposto la cosa in modo confuso.

In realtà la tabella fases è una tabella di “appoggio” ovvero contiene i
5 passaggi che un quotation (budget preventivo) deve avere.

Ricapitolando:
un quotation deve necessariamente avere 5 fases (e per ciasuna delle
fases ci sono un quindicina circa di underfases [perdona il miscuglio di
italiano e inglese maccheronico]).

In sostanza la mia domanda è: nel caso di tabelle come fases e
underfases (tabelle che “cablano” le possibili scelte dell’utente
finale) o se si preferisce l’esempio di tabelle quali quelle di
provincie e relativi comuni (uno sceglie la provincia e poi, in base
alla provincia scelta, compare una lista di comuni appartenenti a quella
provincia) come faccio a risalire alla parte descrittiva (in nome della
fase o della provincia) avendo a disposizione solo l’id nella tabella
dei dati significativi (nel mio caso la tabella quotation, nel caso
delle provincie/comuni la tabella con dati anagrafici dell’utente
finale).

Spero di essere riuscito a spiegarmi meglio.