ActiveRecord,polymorphic has_many,:through,:as

时间:2014-10-28 16:39:21

标签: ruby-on-rails ruby

我是Rails的新手,我在处理一个看起来非常简单的数据库结构时遇到了极大的困难,但是我认为对象必须属于其他对象。

在我正在创建的网站中,用户可能会创建许多帖子

帖子可能适合任意数量的许多不同主题。

所以Rails想要的是帖子属于主题用户,而主题也属于帖子属于帖子(多对多?)。这在我的脑海中有一些意义,但后来我无法想象如何创建独立于 Post 主题(这对网站的功能是合理的)。

这可能吗?任何帮助将不胜感激 - 这让我头疼!

3 个答案:

答案 0 :(得分:0)

我不认为你在这里使用的是多态关系,只是常规的多对多关系。您的模型关系应该类似于:

class User
  has_many :posts
end

class Post
  has_many :post_topics
  has_many :topics, through: :post_topics
  belongs_to :user
end

class Topic
  has_many :post_topics
  has_many :posts, through: :post_topics
end

class PostTopic
  belongs_to :post
  belongs_to :topic
end

答案 1 :(得分:0)

这种情况非常好,主题可以帖子帖子可以有很多主题,这是一种多对多的关系。在rails中通常会转换为 has_and_belongs_to_many 。因此,您可以按如下方式定义模型:

class Post < ActiveRecord::Base   
  has_and_belongs_to_many :topics 
end  
class Topic < ActiveRecord::Base   
  has_and_belongs_to_many :posts 
end

相应生成的迁移和数据库表如下所示:

class CreatePotsAndTopics < ActiveRecord::Migration 
def change   
  create_table :posts do |t|     
  t.string :title     
  t.timestamps   
end  

create_table :topics do |t|     
  t.string :name     
  t.timestamps   
end   

create_table :posts_topics, id: false do |t|     
  t.belongs_to :post     
  t.belongs_to :topic   
end

end 
end

正如您所看到的,Topic和Post表都是独立的表,没有引用任何其他表,这意味着它们可以自己处理。他们通过posts_topics联接表进行链接的方式。这使您可以访问@post.topics@topic.posts

如果您对这样的场景感到不舒服,请选择一本好的轨道书,或者做一个在线教程或课程,它将指导您创建完整的rails应用程序。

答案 2 :(得分:0)

您可以将has_and_belongs_to_many (HABTM)用于此类关系:

class User < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
  has_and_belongs_to_many :topics
end

class Topic < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

除了用户,帖子和主题的表格之外,您还需要为HABTM关系创建迁移:

rails g migration create_posts_users post:references user:references

请注意,模型名称在表名

中按字母顺序显示