【问题标题】:Implementing a model of a model in rails在rails中实现模型的模型
【发布时间】:2013-07-23 21:17:10
【问题描述】:

我刚开始使用 Rails,遇到了一个小问题。我正在尝试实现的是一种允许用户创建“页面”的方法,他们可以在其上添加小部件。

所以我为“pages”建立了一个模型,其中包含名称、描述等数据库字段。它还有一个“has_many :widgets”关联。

这就是我难过的地方。我有一个用户可以使用的小部件列表。诸如“关于我”、“照片库”、“cmets”、“视频”等内容。他们可以选择其中之一,自定义内容并添加到他们的页面。

我想,当用户选择并自定义一个小部件时,我将在小部件表中添加一个条目,其中包含“belongs_to user_id”。但是,我需要指定用户选择的小部件以及输入的自定义内容。

如何在 Rails 中实现这一点?我在哪里可以定义每个小部件类型?

我可以想到几种方法,但不确定哪种方法最好。

  • 一种选择是为每个小部件使用一个模型。我会有 AboutMeWidget、VideoWidget 等。这将允许我使用小部件可能需要的任何字段自定义每个模型。但是,这似乎效率不高,并且需要太多模型。
  • 另一种选择是在某处定义小部件类型(但在哪里?),然后简化小部件表中的“widget_type”。 (因此该表将包含“belongs_to :user”和“has_one :widget_type”。)我还必须为用户输入的数据提供一个字段(可能通过 XML?)。
  • 我能想到的最后一个选项是使用 Ruby 类来定义小部件。当用户自定义小部件时,我将从小部件的类中创建一个对象并存储该对象。

还有其他更好的方法吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord model


    【解决方案1】:

    如果给定小部件实现的特定字段不需要可​​搜索,我会很想将它们放入序列化字段中。

    class Page << AR
      has_many :embedded_widgets
      has_many :widgets, :through => :embedded_widgets
    end
    
    class Widget << AR
      has_many :embedded_widgets
    end
    
    class AboutMeWidget << Widget
    class VideosWidget << Widget
    ... etc ...
    
    class EmbeddedWidget << AR
      belongs_to :page
      belongs_to :widget
      serializes :data
    end
    

    【讨论】:

    • 感谢菲利普的回复。我没有将 has_many 与“通过”一起使用,所以我很难想象这是如何工作的。具有“has_many :widgets, :through => :embedded_widgets”的 Page 模型的目的是什么?如果我理解正确的话,这一切都是为了让我做一些类似 Page.find(2).widgets 的事情。但是当我有一个特定页面时,我所关心的只是该页面上的嵌入式小部件。由于 EmbeddedWidget 有一个“belongs_to :widget”,因此我可以执行“Page.find(2).embeddedwidgets.widget”,它会告诉我它是什么类型。
    • 您可能根本不需要 Page.has_many.widgets。但是,如果您只需要页面所属的小部件的名称而没有自定义字段信息,那就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    相关资源
    最近更新 更多