【问题标题】:setting up databases for associations on Ruby on Rails在 Ruby on Rails 上为关联设置数据库
【发布时间】:2013-04-04 01:12:07
【问题描述】:

第一次使用 ruby​​ on rails,我有一个包含以下 3 个模型的应用程序:

class User < ActiveRecord::Base
  attr_accessible :username, :name, :email, :password
  has_many :comments
  has_many :ideas, :inverse_of => :user
end

class Idea < ActiveRecord::Base
  attr_accessible :title, :description, :rank, :user_id, :status, :privacy, :created_on, :updated_on
  belongs_to :user, :inverse_of => :ideas
  has_many :comments
end

class Comment < ActiveRecord::Base
  attr_accessible :text, :rank, :user_id, :idea_id, :created_on
  belongs_to :user
  belongs_to :idea
end

我有一个用于创建评论的表格,例如:

create_table :comments do |t|
    t.string :comment_id
    t.string :text
    t.string :rank
    t.timestamps
end

我正在尝试为这些播种。我想了解的是如何将带有父想法和父用户的单个评论存储在数据库中,因为这些列一次只能包含一个父级。我是否应该创建一个包含comment_id、user_id 和idea_type 的单独表,其中每个父级的单个评论输入两次?

谢谢!

【问题讨论】:

  • 你能描述一下你想要多态的关系吗?您是要在想法和用户上都支持 cmets,还是仅在用户上支持 cmets?是否存在用户的潜在子类?
  • 我希望在用户和创意上都支持 cmets。我希望评论是多态的。我认为没有子类
  • 您确定多态性确实是您要寻找的吗?如果您希望 cmets 保留在想法或用户上,您将使用多态性,也就是说,它将具有父用户或想法,但只有两者之一。这是您想要的,还是您实际上想要评论属于用户(留下它)和想法(被评论的想法)。如果是这种情况,那么您不需要多态关系,只需要两个has_many/belongs_to 关系。
  • 是的,您是否尝试跟踪特定用户对创意的评论?这更像是has_many :through 关系。我认为在提供解决方案之前,我们首先需要确保我们的关系结构是正确的。
  • 谢谢扎伊德!完全在鼻子上用了后者。因此,考虑到这一点,我是否只需创建一个同时包含用户 ID 和创意 ID 的连接表?

标签: ruby-on-rails migration seeding


【解决方案1】:

听起来您正在尝试将 Comment 实现为连接模型,该模型指示特定用户对创意的评论。如果是这样,您应该能够按如下方式完成:

class User < ActiveRecord::Base
  attr_accessible :username, :name, :email, :password
  has_many :comments
  has_many :commented_ideas, :class_name => 'Idea', :through => :comments, :source => :comment
end

class Idea < ActiveRecord::Base
  attr_accessible :title, :description, :rank, :user_id, :status, :privacy, :created_on, :updated_on
  belongs_to :user  # the user who created the Idea
  has_many :comments
  has_many :commented_users, :class_name => 'User', :through => :comments, :source => :user
end

class Comment < ActiveRecord::Base
  attr_accessible :text, :rank, :user_id, :idea_id, :created_on
  belongs_to :user
  belongs_to :idea
end

create_table :comments do |t|
  t.string :text
  t.string :rank
  t.integer :user_id
  t.integer :idea_id
  t.timestamps
end

【讨论】:

  • 谢谢斯图尔特。我有一个关于扩展这个的问题。是否可以将 belongs_to :user 作为在评论用户之上创建想法的用户添加到想法模型?
  • 谢谢!所以,理论上,我可以像这样继续扩展关联来描述任何情况?
  • 是的,您在这里基本上拥有的是一个 Join 模型,您在其中描述了其他两个模型(用户和想法)之间的关系,但也存储了有关该关系本身的属性(例如评论的文本、发表时的时间戳等)。只要你有一个多对多的关系,但又希望每个连接都有 about 属性,你就可以重用这个模式。见Rails Guide
  • 谢谢。我上下翻阅了 Rails 指南,但仍然没有真正理解到足以实现我的模型
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多