Rails中用户生成的模型

时间:2015-12-16 17:09:05

标签: ruby-on-rails

我正在尝试创建一个跟踪用户项目的数据库。

例如,用户可能想要跟踪他们的汽车及其颜色,品牌和年份。他们将首先创建一个汽车“模型”,他们现在可以添加任意数量的新车。当他们开车时,会提示他们输入颜色,品牌和年份以及通用商品信息。

用户可能还想跟踪他们的猫。但猫“模型”与汽车“模型”有不同的领域。也许他们需要跟踪他们的猫的体重和品种。当他们想要将类型为cat的项目添加到数据库时,我将提示他们输入权重并且不是颜色,品种和年份。

我对rails或SQL不是很有经验,但我想当用户告诉我他们要跟踪汽车时,我可以创建一个带有颜色和年份的汽车桌子。当他们输入汽车时,我会将汽车存储为通用物品,并且还会保存汽车表格的参考,我将存储颜色品牌和年份。我不太确定如何实施,所以我对任何新想法持开放态度。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你是完全正确的,你需要为汽车和猫创建一个表,每个表都有自己的列。 Rails附带Active Record以便于创建数据库。活动记录非常易于使用,并且有一些很棒documentation。 例如,要为汽车创建表格,您必须首先创建汽车模型。 要获取Active Record以创建模型,只需在终端中使用以下命令:

<declare-styleable name="Theme"> <attr format="boolean" name="windowActionBar"/> <attr format="boolean" name="windowNoTitle"/> <attr format="boolean" name="windowActionBarOverlay"/> <attr format="boolean" name="windowActionModeOverlay"/> <attr format="dimension|fraction" name="windowFixedWidthMajor"/> <attr format="dimension|fraction" name="windowFixedHeightMinor"/> <attr format="dimension|fraction" name="windowFixedWidthMinor"/> <attr format="dimension|fraction" name="windowFixedHeightMajor"/> <attr format="dimension|fraction" name="windowMinWidthMajor"/> <attr format="dimension|fraction" name="windowMinWidthMinor"/> <attr name="android:windowIsFloating"/> <attr name="android:windowAnimationStyle"/> <attr format="reference" name="actionBarTabStyle"/> <attr format="reference" name="actionBarTabBarStyle"/> <attr format="reference" name="actionBarTabTextStyle"/> <attr format="reference" name="actionOverflowButtonStyle"/> <attr format="reference" name="actionOverflowMenuStyle"/> <attr format="reference" name="actionBarPopupTheme"/> <attr format="reference" name="actionBarStyle"/> <attr format="reference" name="actionBarSplitStyle"/> <attr format="reference" name="actionBarTheme"/> <attr format="reference" name="actionBarWidgetTheme"/> <attr format="dimension" name="actionBarSize"> <enum name="wrap_content" value="0"/> </attr> <attr format="reference" name="actionBarDivider"/> <attr format="reference" name="actionBarItemBackground"/> <attr format="reference" name="actionMenuTextAppearance"/> <attr format="color|reference" name="actionMenuTextColor"/> <attr format="reference" name="actionModeStyle"/> <attr format="reference" name="actionModeCloseButtonStyle"/> <attr format="reference" name="actionModeBackground"/> <attr format="reference" name="actionModeSplitBackground"/> <attr format="reference" name="actionModeCloseDrawable"/> <attr format="reference" name="actionModeCutDrawable"/> <attr format="reference" name="actionModeCopyDrawable"/> <attr format="reference" name="actionModePasteDrawable"/> <attr format="reference" name="actionModeSelectAllDrawable"/> <attr format="reference" name="actionModeShareDrawable"/> <attr format="reference" name="actionModeFindDrawable"/> <attr format="reference" name="actionModeWebSearchDrawable"/> <attr format="reference" name="actionModePopupWindowStyle"/> <attr format="reference" name="textAppearanceLargePopupMenu"/> <attr format="reference" name="textAppearanceSmallPopupMenu"/> <attr format="reference" name="dialogTheme"/> <attr format="dimension" name="dialogPreferredPadding"/> <attr format="reference" name="listDividerAlertDialog"/> <attr format="reference" name="actionDropDownStyle"/> <attr format="dimension" name="dropdownListPreferredItemHeight"/> <attr format="reference" name="spinnerDropDownItemStyle"/> <attr format="reference" name="homeAsUpIndicator"/> <attr format="reference" name="actionButtonStyle"/> <attr format="reference" name="buttonBarStyle"/> <attr format="reference" name="buttonBarButtonStyle"/> <attr format="reference" name="selectableItemBackground"/> <attr format="reference" name="selectableItemBackgroundBorderless"/> <attr format="reference" name="borderlessButtonStyle"/> <attr format="reference" name="dividerVertical"/> <attr format="reference" name="dividerHorizontal"/> <attr format="reference" name="activityChooserViewStyle"/> <attr format="reference" name="toolbarStyle"/> <attr format="reference" name="toolbarNavigationButtonStyle"/> <attr format="reference" name="popupMenuStyle"/> <attr format="reference" name="popupWindowStyle"/> <attr format="reference|color" name="editTextColor"/> <attr format="reference" name="editTextBackground"/> <attr format="reference" name="imageButtonStyle"/> <attr format="reference" name="textAppearanceSearchResultTitle"/> <attr format="reference" name="textAppearanceSearchResultSubtitle"/> <attr format="reference|color" name="textColorSearchUrl"/> <attr format="reference" name="searchViewStyle"/> <attr format="dimension" name="listPreferredItemHeight"/> <attr format="dimension" name="listPreferredItemHeightSmall"/> <attr format="dimension" name="listPreferredItemHeightLarge"/> <attr format="dimension" name="listPreferredItemPaddingLeft"/> <attr format="dimension" name="listPreferredItemPaddingRight"/> <attr format="reference" name="dropDownListViewStyle"/> <attr format="reference" name="listPopupWindowStyle"/> <attr format="reference" name="textAppearanceListItem"/> <attr format="reference" name="textAppearanceListItemSmall"/> <attr format="reference" name="panelBackground"/> <attr format="dimension" name="panelMenuListWidth"/> <attr format="reference" name="panelMenuListTheme"/> <attr format="reference" name="listChoiceBackgroundIndicator"/> <attr format="color" name="colorPrimary"/> <attr format="color" name="colorPrimaryDark"/> <attr format="color" name="colorAccent"/> <attr format="color" name="colorControlNormal"/> <attr format="color" name="colorControlActivated"/> <attr format="color" name="colorControlHighlight"/> <attr format="color" name="colorButtonNormal"/> <attr format="color" name="colorSwitchThumbNormal"/> <attr format="reference" name="controlBackground"/> <attr format="reference" name="alertDialogStyle"/> <attr format="reference" name="alertDialogButtonGroupStyle"/> <attr format="boolean" name="alertDialogCenterButtons"/> <attr format="reference" name="alertDialogTheme"/> <attr format="reference|color" name="textColorAlertDialogListItem"/> <attr format="reference" name="buttonBarPositiveButtonStyle"/> <attr format="reference" name="buttonBarNegativeButtonStyle"/> <attr format="reference" name="buttonBarNeutralButtonStyle"/> <attr format="reference" name="autoCompleteTextViewStyle"/> <attr format="reference" name="buttonStyle"/> <attr format="reference" name="buttonStyleSmall"/> <attr format="reference" name="checkboxStyle"/> <attr format="reference" name="checkedTextViewStyle"/> <attr format="reference" name="editTextStyle"/> <attr format="reference" name="radioButtonStyle"/> <attr format="reference" name="ratingBarStyle"/> <attr format="reference" name="seekBarStyle"/> <attr format="reference" name="spinnerStyle"/> <attr format="reference" name="switchStyle"/> </declare-styleable>

此模型存储在app / models中。创建模型后,请不要忘记迁移数据库。 为了让用户输入实例的属性,您需要使用form_for。可以找到form_for的文档here。要使用form_for,您需要声明要更改的模型的实例以及在提交表单后要使用的方法。然后,您可以使用一些输入字段进行跟进,这些输入字段都与实例的属性相关联。文档中的示例非常好。

$ rails g model Car color:string make:string year:integer

答案 1 :(得分:0)

我一直在使用名为Meta模型的东西 - 你有app/models/meta.rb,它允许你调用用户在数据库中定义的模型。

我已经开始运行,但效率并不高。

我会告诉你的事情;也许它会给你一些想法.............

-

每个模型都可以拆分为2个常用属性的集合 - title&amp; value

#app/models/node.rb
class Node < ActiveRecord::Base
   # columns id | type | title | value | created_at | updated_at
end

这是您要使用的模型的非常基础(car / cat等)。

例如,您可以让node具有以下统计信息:

# id | type      | title | value            | created_at | updated_at
# 1  | Meta::Cat | Greg  | A new cat we got | 15/12/2015 | 15/12/2015
# 2  | Meta::Cat | Pip   | A little kitten  | 16/12/2015 | 16/12/2015
# 3  | Meta::Car | F480  | The red Ferrari  | 10/12/2015 | 10/12/2015

这将为您提供一组基本数据,然后您可以附加不同的关联。

是的,新关联也可以存储在node数据表中。

事实上,您可以拥有以下内容:

#app/models/meta.rb
class Meta
    classes = %w(cat car)
    if classes.any?
        classes.each do |klass| #-> "class" is reserved
            self.const_set klass.titleize, Class.new(Node) do
                belongs_to :user
            end
        end
    end
end

这将以编程方式创建CatCar类,可以根据需要使用Meta::Cat等进行调用。

我想这就是你如何能够获得不同的基础&#34;楷模。

如果您想添加额外的关联,那么您必须拥有额外的数据,以确保您知道每个模型具有哪些关联。

我还没有这样做,但正如您在上面所看到的,您可以调用一个块,它基本上允许您在伪类中定义不同的东西:

-

因此,如果您有另一个名为Option的元类,您可以使用它来设置每个其他类的关联:

# 2  | Meta::Option | association | has_many :x   | 16/12/2015 | 16/12/2015
# 3  | Meta::Option | association | belongs_to :y | 10/12/2015 | 10/12/2015

我仍然需要考虑它与协会的匹配程度,但简而言之,您将能够做到以下几点:

#app/models/meta.rb
class Meta
    classes = %w(cat car)
    if classes.any?
        classes.each do |klass| #-> "class" is reserved
            self.const_set klass.titleize, Class.new(Node) do
                #-> Node.where(name: "association").pluck(:value)
            end
        end
    end
end

这被称为metaprogramming(或者它可能是伪编程)并且可以做到;它的效率是否完全是另一个问题。