Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:更好的应用程序基础架构_Ruby On Rails_Ruby_Architecture - Fatal编程技术网

Ruby on rails Rails:更好的应用程序基础架构

Ruby on rails Rails:更好的应用程序基础架构,ruby-on-rails,ruby,architecture,Ruby On Rails,Ruby,Architecture,我正在尝试制作一个评论系统,与StackOverflow的评论系统相同。有一个第一级的评论,还有一堆第二级的评论,附在上面。第一个简单的想法就是创建一个单独的模型,sub_comment。但我仍然有这样的感觉,我应该继承初始注释的属性,只添加一个简单的注释id 我还是一个Rails新手,所以问题是——我能做到吗?怎么用?这是一个简单的问题吗 class sub_comment < comment class sub_comment将共享行为放在一个模块中,我不确定我是否理解您的意思。你

我正在尝试制作一个评论系统,与StackOverflow的评论系统相同。有一个第一级的评论,还有一堆第二级的评论,附在上面。第一个简单的想法就是创建一个单独的模型,sub_comment。但我仍然有这样的感觉,我应该继承初始注释的属性,只添加一个简单的注释id

我还是一个Rails新手,所以问题是——我能做到吗?怎么用?这是一个简单的问题吗

class sub_comment < comment 
class sub_comment
模型继承?当然,我需要所有的控制器方法来添加/删除这些子注释。或者我应该建立一个单一的评论模型,其中第一级评论的父级为nil

正确的解决方案是什么


PS.可以自由地为任何涉及该主题的书提供建议。我在这里接受自我教育,所以我很想阅读所有能够澄清未来应用程序架构问题的内容。

我发现使用带有两个指针的简单树结构更容易实现回溯:

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  acts_as_tree
  belongs_to :post

  named_scope :top_level, :conditions => { :parent_id => nil }
end
您甚至可以使用AJAX或通过在下一层之后提取一层来提取多个级别的注释:

# Repeat while comments are found
loop do
  level = @post.comments.find(:all, :conditions => { :parent_id => @comments.collect(&:id) })

  if (level.empty?)
    break
  else
    @comments += level
  end
end

可以根据演示的需要对它们进行排序。

一个选项是拥有两个单独的类,并将共享行为放在一个模块中。这样一来,您就不会执行单表继承(这就是您的继承示例的意思,这是我遇到的问题),但您也不会复制代码。

从概念上讲,您正在尝试创建自引用关联。这当然是最干净的方式,因为您不必担心额外的表和模型,尽管设置起来可能很复杂


我建议您查看,它将一步一步地指导您如何开始。

简短而甜蜜的回答是,我将使用您的“父id为零”方法进行顶级评论,显然子评论将具有父id。记住,在Rails世界里,DRY主宰着一天。如果您可以使用一个类(在这种情况下它是有意义的),那么您应该。

>将共享行为放在一个模块中,我不确定我是否理解您的意思。你能解释一下吗?
# Repeat while comments are found
loop do
  level = @post.comments.find(:all, :conditions => { :parent_id => @comments.collect(&:id) })

  if (level.empty?)
    break
  else
    @comments += level
  end
end