рельсовые ассоциации - Как бы вы представили эти отношения? - PullRequest
1 голос
/ 06 марта 2011

Я пытаюсь найти лучший способ представить следующие отношения.

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 ]

3 голосов
/ 06 марта 2011

То, что вы описываете, является отношением многих ко многим.В терминах ассоциаций 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 и иметь *Поля 1006 * и article_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_many для получения дополнительной информации о has_and_belongs_to_many

1 голос
/ 06 марта 2011

Ответ на вопрос № 2 : Вам не нужен объединительный стол для этого. Всего 3 отдельные таблицы (газеты, статьи и подписчики) будут в порядке. Внешние ключи для magazine_id будут в статьях и подписчиках.

1 голос
/ 06 марта 2011

Ответ на вопрос № 1 :

в моделях / Газета.rb: has_many: статьи has_many: подписчики

в контроллеры / Газеты_controller.rb

def create
  @newspaper = NewsPaper.new(params[:newspaper])
  if @newspaper.save
    redirect_to 
  else
    render :new
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...