Ruby on rails Rails 3:使用不同的帖子类型(图像、链接、文本、视频)创建帖子模型。我应该使用什么样的继承?

Ruby on rails Rails 3:使用不同的帖子类型(图像、链接、文本、视频)创建帖子模型。我应该使用什么样的继承?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我正在开发一个允许用户发帖的应用程序。每个帖子都有一个类型(图像、视频、链接、文本),具有相似和唯一的变量。我想提交这些通过不同的形式在一个“作曲家”,可在整个网站 这是海报模型,图库: class Gallery < ActiveRecord::Base attr_accessible :name, :asset has_attached_file :asset, :styles => { :small => '160x120#', :medium =>

我正在开发一个允许用户发帖的应用程序。每个帖子都有一个类型(图像、视频、链接、文本),具有相似和唯一的变量。我想提交这些通过不同的形式在一个“作曲家”,可在整个网站

这是海报模型,图库:

class Gallery < ActiveRecord::Base
    attr_accessible :name, :asset
    has_attached_file :asset, :styles => { :small => '160x120#', :medium => "500x", :thumb => "300x200#" }
    belongs_to :user
    has_many :likes
    validates :user_id, presence: true
    validates :type, presence: true
    validates :name, presence: true, length: { maximum: 140, minimum: 1 }
end
结束

此外,我想创建一个“publisher”表单,其中包含每种帖子类型的表单,并允许您创建任何类型的帖子


你将如何处理这个问题?我是Rails的新手,我想利用Rails提供的所有便利。非常感谢

我会让Gallery成为一个抽象类,每个子类都有一个单独的db表。这将允许子类具有唯一属性以及共享属性

class Gallery < ActiveRecord::Base
  self.abstract_class = true # very important
  .
  .
end
类库
我会使画廊控制器多态:

class GalleriessController < ApplicationController
  before_filter :find_gallery

  private

  def find_gallery
    @klass = params[:gallery_type].capitalize.constantize
    @gallery = @klass.find(params[:gallery_id])
  end
end
class GalleriesController
视图:

您可以使用@gallery的form_,但使用上面的多态控制器时需要进行一些处理。它需要提交gallery_类型和gallery_id参数,而不仅仅是id。您可以修改form_for的:url参数来完成此操作,或者使用隐藏的_字段。 在表单_中,您可以使用partials,每个子类一个

路线:

您可以这样定义常规资源:资源:库 但是,您需要将id参数设置为gallery_id(并且始终传递galley_type参数)。选中此项:

(可能)结论

有时,花哨的多态性会很好地解决问题,但在其他情况下,更简单的暴力方法可能更有意义:每个子类都有一个控制器。这要视情况而定。
如果你最终做了太多Rails框架没有免费提供给你的东西,也许最好考虑另一种方法。

我有一个类似的场景,在寻找一种很好的实现方法之后,我发现了我正在使用的gem:

它使用多态has_one关联来模拟多表继承,因此在您的情况下,您可以执行以下操作:

class Gallery < ActiveRecord::Base
  acts_as_superclass
  ...
end

class Image < ActiveRecord::Base
  acts_as :gallery
  ...
end

class Link < ActiveRecord::Base
  acts_as :gallery
  ...
end
类库
我希望这对你有帮助。
干杯

这太棒了!在这种情况下,您将如何处理a)路由和b)通过form_for创建新对象?此外,我是否可以为每种库类型创建新的分区?更新了我关于视图和路由的回答。
class GalleriessController < ApplicationController
  before_filter :find_gallery

  private

  def find_gallery
    @klass = params[:gallery_type].capitalize.constantize
    @gallery = @klass.find(params[:gallery_id])
  end
end
class Gallery < ActiveRecord::Base
  acts_as_superclass
  ...
end

class Image < ActiveRecord::Base
  acts_as :gallery
  ...
end

class Link < ActiveRecord::Base
  acts_as :gallery
  ...
end