通过参考表一对多

时间:2015-08-16 18:48:07

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord

我试图了解如何通过参考表实现一对多关系。我正在寻找this guide我只是在一个模型上写has_many所以它会是一对多的,但我并不完全确定(我写了一些东西,但它&#39} ; s不工作)。无论如何,我这样做是为了为我保存一张桌子,做得对,而不仅仅是工作。

该模型如下:

Microposts,:id,:content

Tag, :id, :name
Tag_microposts, :tag_id, :micropost_id
Article, :id, :text
Article_microposts, :article_id, :micropost_id

我可以用标签/文章的id做两个微博表。但我认为这样做更好更直接。

最后我感兴趣的是通过microposts模型获得tag。所以在tag_controller中可以做到:

def index
  @tag = Tag.find(params[:id])
  @microposts = @tag.microposts
end

一些代码:

class Tag < ActiveRecord::Base
  ...

  has_many :tag_microposts, foreign_key: :tag_id, dependent: :destroy
  has_many :microposts, through: :tag_microposts, source: :micropost

  ...
end


class TagMicropost < ActiveRecord::Base
  validates :tag_id, presence: true
  validates :micropost_id, presence: true
end


class Micropost < ActiveRecord::Base
  belongs_to :user
  belongs_to :tag

  validates :content, presence: true, length: {minimum: 10, maximum: 250}
  validates :user_id, presence: true
end

1 个答案:

答案 0 :(得分:2)

我可以问你为什么要使用参考表吗?您只能与正在关联的两个模型进行一对多关联。如果您想将标签与许多帖子相关联,您可以在模型中执行此操作。

class Tag < ActiveRecord::Base
has_many :microposts
end

class Micropost < ActiveRecord::Base
belongs_to :tag
#added in edit
belongs_to :article

validates :content, presence: true, length: {minimum: 10, maximum: 250}
validates :user_id, presence: true
end

这应该让你这样做:

@tag.microposts

很好。 forgien键将存储在Micro post模型中,因此请务必添加该列。您可以使用活动迁移。调用列tag_id,rails应该处理剩下的事情。

编辑*

添加了文章协会。您提出的问题仅在您需要获得微博的文章/标签时才有意义。使用此模型,执行此操作的代码仍然非常简单。

@tag ||= @micropost.tag

使用像这样的条件赋值运算符只会在关联存在的情况下分配@tag。如果你给我更多关于如何使用这些模型的细节,我可以给你一个更好的答案。

相关问题