我正在尝试创建一个跟踪用户项目的数据库。
例如,用户可能想要跟踪他们的汽车及其颜色,品牌和年份。他们将首先创建一个汽车“模型”,他们现在可以添加任意数量的新车。当他们开车时,会提示他们输入颜色,品牌和年份以及通用商品信息。
用户可能还想跟踪他们的猫。但猫“模型”与汽车“模型”有不同的领域。也许他们需要跟踪他们的猫的体重和品种。当他们想要将类型为cat的项目添加到数据库时,我将提示他们输入权重并且不是颜色,品种和年份。
我对rails或SQL不是很有经验,但我想当用户告诉我他们要跟踪汽车时,我可以创建一个带有颜色和年份的汽车桌子。当他们输入汽车时,我会将汽车存储为通用物品,并且还会保存汽车表格的参考,我将存储颜色品牌和年份。我不太确定如何实施,所以我对任何新想法持开放态度。在此先感谢您的帮助。
答案 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
这将以编程方式创建Cat
和Car
类,可以根据需要使用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(或者它可能是伪编程)并且可以做到;它的效率是否完全是另一个问题。