rails association - 你会如何表达这种关系?

时间:2011-03-06 08:06:11

标签: ruby-on-rails activerecord associations

我想找出一种代表以下关系的最佳方式。

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 个答案:

答案 0 :(得分: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

有关has_and_belongs_to_many

的详情,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many

答案 1 :(得分:1)

回答问题#1

在models / newspaper.rb中: has_many:文章 has_many:订阅者

in controllers / newspaper_controller.rb

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

答案 2 :(得分:1)

回答问题#2 : 你不需要一个联接表。只需3张独立的桌子(报纸,文章和订阅者)就可以了。 newspaper_id的外键是文章和订阅者。