# Active record bello ma

**URL:** <https://www.ruby-forum.com/t/active-record-bello-ma/157116>\
**Category:** IT\
**Created:** [January 7, 2009, 2:21pm UTC](https://www.ruby-forum.com/t/active-record-bello-ma/157116 "2009-01-07T14:21:41Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![mauro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/45deac/32.png) [@mauro](https://www.ruby-forum.com/u/mauro)\
**Post date:** [January 7, 2009, 2:21pm UTC](https://www.ruby-forum.com/t/active-record-bello-ma/157116/1 "2009-01-07T14:21:41Z")

</div>

…se volessi fare un collegamento molti a molti tra due tabelle?  
Dovrei creare una terza tabella con le chiavi primarie delle due  
tabelle.  
Tali due chiavi vengono a formare una chiave primaria composita per la  
tabella di collegamento…si ma…come specifico, usando le  
migration  
che si tratta di una chiave composita?  
Boh…

---

<div class="post-metadata">

**Author:** ![mauro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/45deac/32.png) [@mauro](https://www.ruby-forum.com/u/mauro)\
**Post date:** [January 8, 2009, 10:32am UTC](https://www.ruby-forum.com/t/active-record-bello-ma/157116/2 "2009-01-08T10:32:57Z")

</div>

2009/1/7 Mauro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> …se volessi fare un collegamento molti a molti tra due tabelle?  
> Dovrei creare una terza tabella con le chiavi primarie delle due tabelle.  
> Tali due chiavi vengono a formare una chiave primaria composita per la  
> tabella di collegamento…si ma…come specifico, usando le migration  
> che si tratta di una chiave composita?  
> Boh…

Niente?

---

<div class="post-metadata">

**Author:** ![mauro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/45deac/32.png) [@mauro](https://www.ruby-forum.com/u/mauro)\
**Post date:** [January 8, 2009, 10:38am UTC](https://www.ruby-forum.com/t/active-record-bello-ma/157116/3 "2009-01-08T10:38:53Z")

</div>

> **[rails.info](http://guides.rails.info/association_basics.html#_the_tt_has_and_belongs_to_many_tt_association)**
>
> Ruby on Rails,Rails Tutorial,Ruby Basics,Rails 4,Bar Rails,Rail

Il 8 gennaio 2009 10.32, Mauro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![mauro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/45deac/32.png) [@mauro](https://www.ruby-forum.com/u/mauro)\
**Post date:** [January 8, 2009, 10:41am UTC](https://www.ruby-forum.com/t/active-record-bello-ma/157116/4 "2009-01-08T10:41:48Z")

</div>

2009/1/7 Mauro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> …se volessi fare un collegamento molti a molti tra due tabelle?  
> Dovrei creare una terza tabella con le chiavi primarie delle due tabelle.

Hai due possibilità. Puoi usare una join table oppure un join model  
tramite l’opzione :through (particolarmente, se ti servono altri  
campi).

> Tali due chiavi vengono a formare una chiave primaria composita per la  
> tabella di collegamento…si ma…come specifico, usando le migration  
> che si tratta di una chiave composita?  
> Boh…

Se scegli di proseguire con la join table, questa tabella non ha  
modello corrispondente e non ha bisogno di una chiave primaria id.

class Post \< ActiveRecord::Base  
has\_and\_belongs\_to\_many :categories  
end

class Category \< ActiveRecord::Base  
has\_and\_belongs\_to\_many :posts  
end

# In your migration file

create\_table :categories\_posts, :id =\> false do |t|  
t.integer :category\_id  
t.integer :post\_id  
end

## Ciao, Antonio

[http://antoniocangiano.com](http://antoniocangiano.com) - Zen and the Art of Programming  
[http://math-blog.com](http://math-blog.com) - Mathematics is wonderful!  
[http://stacktrace.it](http://stacktrace.it) - Aperiodico di resistenza informatica  
Currently writing “Ruby on Rails for Microsoft Developers” for Wrox.

---

<div class="post-metadata">

**Author:** ![mauro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/45deac/32.png) [@mauro](https://www.ruby-forum.com/u/mauro)\
**Post date:** [January 25, 2009, 12:52pm UTC](https://www.ruby-forum.com/t/active-record-bello-ma/157116/5 "2009-01-25T12:52:29Z")

</div>

2009/1/25 Mauro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Se uso has\_many :through devo creare la tabella di collegamento mentre se  
> uso has\_and\_belong\_to\_many la terza tabella non la dovrei creare?

la terza tabella devi crearla comunque,  
però:nel caso has\_and\_belongs\_to\_many:

# in migration

def self.up  
create\_table ‘categories’ do |t|  
t.string :name  
t.string :qualcosa  
t.timestamps  
end

create\_table ‘products’ do |t|  
t.string :name  
t.string :description  
t.timestamps  
end

create\_table ‘categories\_products’, :id =\> false do |t|  
t.column :category\_id, :integer  
t.column :product\_id, :integer  
end  
end

# models/category.rb

class Category \< ActiveRecord::Base  
has\_and\_belongs\_to\_many: :produtcs  
end

# models/product.rb

class Product \< ActiveRecord::Base  
has\_and\_belongs\_to\_many: :categories  
end

non devi creare un modello per categories\_products.

così puoi fare product.categories e category.products, ma non puoi  
avere informazioni aggiuntive.

nel caso has\_many :through, invece:

# in migration

def self.up  
create\_table ‘hotels’ do |t|  
t.string :name  
t.string :address  
t.timestamps  
end

create\_table ‘clients’ do |t|  
t.string :name  
t.integer :age  
t.timestamps  
end

create\_table ‘subscriptions’ do |t|  
t.integer :hotel\_id  
t.integer :client\_id  
t.boolean :premiere  
t.integer :price  
t.datetime :entered\_at  
t.datetime :leaved\_at  
t.timestamps  
end  
end

# models/hotel.rb

class Hotel \< ActiveRecord::Base  
has\_many :subscriptions  
has\_many :clients, :through =\> :subscriptions  
end

class Client \< ActiveRecord::Base  
belongs\_to :subscriptions  
belongs\_to :hotels, :through =\> :subscriptions  
end

class Subscription \< ActiveRecord::Base  
has\_many :hotels  
has\_many :subscriptions  
end

in questo caso devi creare un modello Subscription.

puoi ancora usare client.hotels e hotel.clients, ma puoi anche avere  
informazioni aggiuntive, passando per subscriptions.

n.b. codice scritto di getto, non testato. prova, se non funziona chiedi  
pure.

pietro

---

<div class="post-metadata">

**Author:** ![mauro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/45deac/32.png) [@mauro](https://www.ruby-forum.com/u/mauro)\
**Post date:** [January 25, 2009, 9:47pm UTC](https://www.ruby-forum.com/t/active-record-bello-ma/157116/6 "2009-01-25T21:47:35Z")

</div>

2009/1/25 Pietro G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> t.string :qualcosa  
> t.column :category\_id, :integer
> 
> # models/product.rb
> 
> nel caso has\_many :through, invece:  
> t.string :name  
> t.datetime :leaved\_at  
> class Client \< ActiveRecord::Base
> 
> puoi ancora usare client.hotels e hotel.clients, ma puoi anche avere  
> informazioni aggiuntive, passando per subscriptions.
> 
> n.b. codice scritto di getto, non testato. prova, se non funziona chiedi  
> pure.

la tua relazione sarebbe molti a molti tra hotels e clients?

---

<div class="post-metadata">

**Author:** ![mauro](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/45deac/32.png) [@mauro](https://www.ruby-forum.com/u/mauro)\
**Post date:** [January 25, 2009, 12:13pm UTC](https://www.ruby-forum.com/t/active-record-bello-ma/157116/7 "2009-01-25T12:13:43Z")

</div>

2009/1/8 Antonio C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> 2009/1/7 Mauro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > …se volessi fare un collegamento molti a molti tra due tabelle?  
> > Dovrei creare una terza tabella con le chiavi primarie delle due tabelle.
> 
> Hai due possibilità. Puoi usare una join table oppure un join model  
> tramite l’opzione :through (particolarmente, se ti servono altri  
> campi).

Sto vedendo la guida  
[http://guides.rubyonrails.org/association\_basics.htmlma](http://guides.rubyonrails.org/association_basics.htmlma) il mio inglese  
non e’ il massimo.  
Se uso has\_many :through devo creare la tabella di collegamento mentre  
se  
uso has\_and\_belong\_to\_many la terza tabella non la dovrei creare?  
Ho capito male?
