rails中一次迁移中的多个表 - 如何命名

时间:2011-12-02 03:32:54

标签: ruby-on-rails sqlite migration

据我所知,

rails遵循其命名约定提供各种好处。因此,在我刚刚创建的Expect模型中,我还获得了所有类似命名的视图和控制器,并且在迁移中

class CreateExpects < ActiveRecord::Migration
  def self.up
    create_table :expects do |t|

我注意到它会自动在此迁移中创建表“expect”,并且我假设从中获得了一些好处。但是,如果我想在此迁移中创建多个表

,该怎么办?

例如,我正在构建一个非常简单的应用程序,向学生提出两个问题,

The students will be asked two questions on a form

"Which courses do you think students will likely fail?" (Check all that apply)
Math, English, French, Science

"Which courses do you think students will likely pass?" (check all that apply)
Math, English, French, Science

但是人们构建数据库的建议是创建几个表,并且由于这些表也有不同的名称,我如何处理我不再符合rails约定的事实

例如,如果在views / expected / new.html.erb(和_form)中的一个表单中询问这两个问题,我如何确保每个问题的数据都进入正确的表格?然后在我显示数据的其他页面中将它们全部拉出来?

1 个答案:

答案 0 :(得分:1)

我不认为我完全明白你在问什么,但我认为我可以根据你的问题帮助你。这就是您的数据库设置应该是什么样的。

  1. 创建一个名为student的表。您可以使用generate model命令。

    rails生成模型学生

  2. 转到您的迁移文件夹(db / migrate)并查找学生迁移文件。

  3. 在迁移文件中添加这些行。 请注意,您可以在学生和主题之间使用一些关联来设置数据库,但对于像这样的简单应用程序,我不会打扰。

    b.boolean:firstanswer_math
    t.boolean:firstanswer_english
    t.boolean:firstanswer_french
    t.boolean:firstanswer_science
    t.boolean:s​​econdanswer_math
    t.boolean:s​​econdanswer_english
    t.boolean:s​​econdanswer_french
    t.boolean:s​​econdanswer_science

  4. 在视图中,将复选框与每个问题的每个主题相关联。

    第一个问题
    &lt;%= form.check_box:firstanswer_math =&gt;
    &lt;%= form.check_box:firstanswer_english =&gt;
    ...

  5. 当然,您需要在学生的Controller文件中使用适当的方法,但我会省略该步骤。

  6. 如果我已经充分回答了你的问题,请告诉我。


    首次修改

    • 我可以打电话给student.firstanswer_math,但我不能打电话给firstanswer_math.student你知道我是如何设置迁移来创建那种可逆的方法调用灵活性的吗?

    没有这种灵活性。你必须按照这个顺序, object.attribute

    • 我需要一个has_many_through吗?

    不,你应该在没有它的情况下找到它。如果要将两个模型与两个不同的数据库表相关联,则需要has_many类型的关联。在我们的例子中,可以在一个模型和几个属性中轻松设置应用程序。所以有一张桌子就可以了。

    • 即使你可能认为它不适合这个简单应用程序的目的,因为我正在学习我想知道是否使用更复杂的结构允许调用student.firstanswer_math和firstanswer_math.student可能会让我更灵活一些在我紧缩和呈现不同方式的数据方面。

    我想我现在理解为什么你提出“firstanswer_math.student”。您是否正在尝试将firstanswer_math设置为true或其他内容的学生?如果你想这样做,你可以对学生使用find方法。例如,

    @students = Student.find_all_by_firstanswer_math( true )
    
    • 我还在学习rails,所以我真的只是在玩,但如果你能为这个更复杂的设置建议最好的结构(第一推荐非常好),那么请做

    我不会说我是Ruby on Rails专家,但我认为大多数Ruby on Rails开发人员可能会为我的问题实施我的实现。