2011-03-06 67 views
1

我想弄清楚表示下列關係的最佳方法。鋼軌關聯 - 您將如何表達這種關係?

Newspaper has_many Articles 
Newspaper has_many Subscribers 

訂戶被允許保存他們的個人頁面的文章。

兩個問題:

1)關係如何在軌道中看起來像? 「保存」操作看起來如何?

的使用的has_many似乎以下不正確的對我說:

class ArticleController < ApplicationController 
    def save 
    a = Article.find(101) 
    @user.saved_articles << a 
    end 
end 

2)我是否需要加入一個看起來像這個表Saved_Articles?

Saved_Articles 
---------------- 
user_id, article_id 

回答

3

你所描述的是一種多對多的關係。在Rails的協會而言,這是定義它的一種方式:

class Newspaper 
    has_many :articles 
    has_many :subscribers 
end 

class Subscriber 
    belongs_to :newspaper 
    has_and_belongs_to_many :articles 
end 

class Article 
    belongs_to :newspaper 
    has_and_belongs_to_many :subscribers 
end 

使用has_and_belongs_to_many,您將需要一個連接表,但它需要被調用articles_subscribers而且會對subscriber_idarticle_id領域:

articles_subscribers 
-------------------- 
article_id 
subscriber_id 

save行動,那麼看起來像以下,假設@user是的Subscriber一個實例:

class ArticlesController < ApplicationController 
    def save 
    @user.articles << Article.find(params[:id]) 

    # handle the response - render or redirect 
    end 
end 

有關更多信息,請參見http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_manyhas_and_belongs_to_many

+0

謝謝你這樣詳細的答案。 – truthSeekr

1

回答第1

在模型/ newspaper.rb: 的has_many:文章 的has_many:用戶

在控制器/ newspapers_controller。 rb

 
def create 
    @newspaper = NewsPaper.new(params[:newspaper]) 
    if @newspaper.save 
    redirect_to 
    else 
    render :new 
    end 
end 
1

問題#2的答案: 對此,您不需要連接表。只有3個單獨的表格(報紙,文章和訂閱者)會很好。 newspaper_id的外鍵將出現在文章和訂閱者中。