Join tra tabelle


#1

Ciao a tutti,
sono alle prime armi di Ruby on Rails. Ho creato la mia piccola
applicazione web ed ho una tabella links che contiene i link da
visualizzare in una pagina del sito. Volendo dividere i link in
categorie ho creato una tabella categories.

Questo è il codice SQL delle due tabelle:

DROP TABLE IF EXISTS xbrail2_production.categories;
CREATE TABLE xbrail2_production.categories (
id int(10) unsigned NOT NULL auto_increment,
name_en varchar(255) default NULL,
name_it varchar(255) default NULL,
PRIMARY KEY USING BTREE (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS xbrail2_production.links;
CREATE TABLE xbrail2_production.links (
id int(11) NOT NULL auto_increment,
site_name varchar(255) default NULL,
subtitle_en text,
abstract_en text,
category varchar(255) default NULL,
url varchar(255) default NULL,
top_site tinyint(1) default NULL,
subtitle_it text,
abstract_it text,
categoryId int(10) unsigned default ‘1’,
PRIMARY KEY USING BTREE (id),
KEY FK_links_categories (categoryId),
CONSTRAINT FK_links_categories FOREIGN KEY (categoryId) REFERENCES
categories (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Nel model Link ho messo belongs_to :categories nel model Category ho
messo has_many :links.
Nella pagina di amministrazione del sito ho la lista completa dei link
con il campo categoryId che mi visualizza l’identificativo (numero
intero) della categoria.
Come posso fare a visualizzare il nome della categoria al posto del id?
Io ho provato dichiarare un metodo nel model link che fa una join tra le
due tabelle:

def find_category_name
name = Link.find(:all, :joins => “INNER JOIN categories on
categories.id = categoryId”)
end

Purtroppo non sò se sono sulla buona strada e se sì come andare avanti.

Vi srivo il codice della view list che visualizza la lista dei link:
<% for link in @links %>



<%=h(link.site_name) %>



<%=h(link.category) %>



<%=h(link.categoryId) %>

Questo è il controller con il metodo che crea la list

def list
@link_pages, @links = paginate :links, :per_page => 15
end

Qualche suggerimento? Scusate la mia domanda banale e probabilmente
anche la poca chiarezza nell’esporre il problema ma purtroppo ho poche
idee e ben confuse.

Vi ringrazio aticipatamente per le risposte e la pazienza.

Saluti

Taddei Fabrizio

  ___________________________________

L’email della prossima generazione? Puoi averla con la nuova Yahoo!
Mail: http://it.docs.yahoo.com/nowyoucan.html


#2

tarini wrote:

se fai link.category.name_it ?

Ciao tarini, grazie per la risposta ho provato a mettere nella view list
link.category.name_it come hei suggerito,
ma mi dà questo errore:

ActionView::TemplateError (undefined method `name_it’ for “XBRL in the
world”:String) on line #25 of
vendor/extensions/xbrlink/app/views/admin/links/list.rhtml:
22: <%=h(link.category) %>

23:
24:


25: <%=h(link.category.name_it) %>

26:
27:
28: <%=h(link.url) %>

Qualche idea?

Ciao e grazie


#3

se fai link.category.name_it ?


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away


#4

guarda… non so aiutarti… forse è un problema l’underscore…

Il 02/05/07, Fabrizio T. removed_email_address@domain.invalid ha scritto:

world":String) on line #25 of


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away


#5

Nel modello Link scrivi “belongs_to :category” (invece di categories)

Sarebbe meglio usare category_id invece di categoryId. Così Ruby on
Rails può usarlo automaticamente per fare i join.

Altrimenti dovresti fare:

class Category
has_many :links, :foreign_key => “categoryId”
end

class Link
belongs_to :category, :foreign_key => “categoryId” # invece di
categories
end

Dopo, puoi fare “name = Link.find(:first).category.name” o

class Link
def category_name
self.category.name rescue “n.d.”
end
end


#6

Rob C. wrote:

Nel modello Link scrivi “belongs_to :category” (invece di categories)

Sarebbe meglio usare category_id invece di categoryId. Cos� Ruby on
Rails pu� usarlo automaticamente per fare i join.

Funziona grazie mille Rob!!!


#7

Grazie lo stesso tarini…

Qualcun altro potrebbe aiutarmi?