我是Rails的新手,我在处理一个看起来非常简单的数据库结构时遇到了极大的困难,但是我认为对象必须属于其他对象。
在我正在创建的网站中,用户可能会创建许多帖子。
帖子可能适合任意数量的许多不同主题。
所以Rails想要的是帖子属于主题和用户,而主题也属于帖子属于帖子(多对多?)。这在我的脑海中有一些意义,但后来我无法想象如何创建独立于 Post 的主题(这对网站的功能是合理的)。
这可能吗?任何帮助将不胜感激 - 这让我头疼!
答案 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
请注意,模型名称在表名
中按字母顺序显示