4

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

这是后期模型,画廊:

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

我正在考虑使用单表继承,如下所示:

class Image < Gallery
end

class Link < Gallery
end

class Video < Gallery
end

class Text < Gallery
end

但我没有达到我想要的结果。一方面,我想使用 Gallery 控制器中的方法,例如:

# galleries_controller.rb
def like 
    @gallery = Gallery.find(params[:id])
    @like = @gallery.likes.build(:user_id => current_user.id)
    respond_to do |format|
        if @like.save
        format.html { redirect_to @gallery }
        format.js
    end
end

结尾

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

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

4

2 回答 2

0

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

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

意见:

您可以使用 form_for @gallery 但它需要一些按摩才能与上面的多态控制器一起使用。它需要提交一个gallery_type 和gallery_id 参数而不仅仅是一个id。您可以修改 form_for 的 :url 参数来执行此操作或使用 hidden_​​fields。在 form_for 中,您可以使用部分,每个子类一个。

路线:

您可以像这样定义常规资源: resources :galleries 但是您需要将 id 参数设置为 gallery_id(并且始终传递galley_type 参数)。检查这个:更改 Rails 路由中的 id 参数

(可能的)结论

有时花哨的多态东西会很好地工作,但在其他情况下,更简单的蛮力方法可能更有意义:为每个子类设置一个控制器。这取决于实际情况。如果你最终做了太多 Rails 框架没有免费提供给你的东西,也许最好考虑另一种方法。

于 2012-10-15T18:57:22.690 回答
0

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

https://github.com/hzamani/acts_as_relation

它使用多态 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

我希望这可以帮助你。干杯!

于 2012-10-16T05:52:43.840 回答