我试图了解如何通过参考表实现一对多关系。我正在寻找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
答案 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。如果你给我更多关于如何使用这些模型的细节,我可以给你一个更好的答案。