需要Rails中的Active Record Associations帮助,具有自引用和多对一映射

时间:2013-01-25 07:11:23

标签: ruby-on-rails-3 activerecord associations polymorphic-associations

要求:
我正在为本地校园创建一个类似Twitter的应用程序,用户可以在140个字符内分享他们的反馈,就像推特的方式一样。

对于每个反馈,可以对反馈进行多次回复。这些回复类似于Twitter回复,其中回复也是140个字符响应,如推文。

基本上,输入反馈或响应的屏幕与相同的功能元素相同。
例如: -

  

这是一个演示反馈 - 用户1
    这是对反馈的回应 - 用户2


我正在使用rails进行开发,这就是我的反馈模型

class Feedback < ActiveRecord::Base
  attr_accessible :title     

end

我在数据库中的表结构如下所示: -
反馈表

  

id,integer,primary key
title,varchar(255)

这就是我想要管理对反馈的回复的方式

一个名为“ Feedback_Responses ”的单独表格,其结构如下:

  

feedback_id(int)[这是父反馈ID]
response_id   (int)[这是对父反馈ID的回复]

我的问题 我理解这里需要自我引用映射,具有多对一关系。但是,我不清楚如何从用于创建反馈的相同视图创建响应。其次,响应是对系统的另一个反馈,因此除非创建响应并生成其id,否则Feedback_Responses表将不会填充所需的映射。因此,在这种情况下,我真的很无能为力,也许对于如何在单独的表上创建响应和管理映射感到困惑。我开始用这个应用程序学习rails。

2 个答案:

答案 0 :(得分:0)

class Feedback < ActiveRecord::Base
  attr_accessible :title 
  validates :title, :length => { :maximum => 140 }
  has_many_and_belong_to :responses   
end

class Response < ActiveRecord::Base
  has_many_and_belong_to :feedbacks      
end

要从反馈对象获取回复,请使用@feedback.responses 响应对象@response.feedbacks的相同内容 这种关系易于维护。如果需要,可以添加中间表。

答案 1 :(得分:0)

我不太了解您的设计,但看起来您的主要实体(相当于推文)是“反馈”,每个“反馈”都可以有很多“回复”(如评论)。我不清楚的是,“回应”本身是否可以成为“反馈”,但我现在认为它不是“反馈”。因此,根据此描述,您的设计说反馈有很多响应。我发现“feedback_responses”表与此事无关,因为它听起来像响应只与一个反馈相关联。所以,放下桌子。

所以,我会这样写:

# table feedbacks
# id: Integer
# title: Varchar 140
class Feedback < ActiveRecord::Base
  has_many :responses
end

# table responses
# id: Integer
# feedback_id: Integer
class Response < ActiveRecord::Base
  belongs_to :feedback
end

但是,如果你想处理响应有一个反馈而不是对另一个反馈的响应,你可以只使用继承作为解决方案:

# additionally feedback_id: Integer to the feebacks table
class Feedback < ActiveRecord::Base
  has_many :responses
end

class Response < Feedback
  belongs_to :feedback
end

只要您有两个可区分的模型,视图生成将自动变得容易。