Rails5添加引用以创建一对多

时间:2016-07-27 02:44:09

标签: ruby-on-rails ruby migration ruby-on-rails-5

我创建了两个模型Restaurantmenu,以及餐厅has_many菜单。 我通过输入

创建菜单
rails g model Menu name restaurant:references

但我发现我无法按类型Menu.create(name: "test1")

创建菜单
m1 = Menu.create(name: "test1")
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
 => #<Menu id: nil, name: "test1", restaurant_id: nil, created_at: nil, updated_at: nil>

然后我检查了migrationschema,在Rails5迁移中,references变成了这个

#Menu migration
...
t.references :restaurant, foreign_key: true

我认为在Rails4中,它会像

一样
t.references :restaurant, index: true

这是我无法创造meun的原因吗?

更新

这是迁移文件

class CreateMenus < ActiveRecord::Migration[5.0]
  def change
    create_table :menus do |t|
      t.string :name
      t.references :restaurant, foreign_key: true

      t.timestamps
    end
  end
end

1 个答案:

答案 0 :(得分:1)

您无法创建菜单,因为您的迁移包含restaurant_id上的外键约束,这意味着无法在没有餐厅的情况下创建菜单(类似地,如果存在关联菜单,则无法销毁餐厅) 。如果这是您的意图,则您需要在创建菜单时提供有效的restaurant_id,或者通过restaurant

上的关联创建有效@restaurant.menus.create(name: 'test1')
:foreign_key

如果您不需要外键约束,请修改迁移并删除:index选项。如果这样做,请将 if (counter_1 == count) { left += 300; top = 50; count = count + 25; } List<Button> buttons = new List<Button>(); Button newButton = new Button(); buttons.Add(newButton); this.Controls.Add(newButton); newButton.Left = left; newButton.Top = top; TextBox newtextbox = new TextBox(); Controls.Add(newtextbox); if (counter_1 == 100) { button1.Enabled = false; } newtextbox.Left = left + 100; newtextbox.Name = "text" + counter_1; // TextWriter tsw = new StreamWriter(@"d:\test.txt", true); //tsw.WriteLine(newtextbox.Text); // tsw.Close(); newtextbox.Top = top; top += newButton.Height + 2; newButton.Text = "position" + counter_1; textBox1.Text = newtextbox.Name; } private void Save_Click(object sender, EventArgs e) { foreach (Control item in Controls) { if (item.GetType() == typeof(TextBox)) { savetext[counter_1] = item.Text.ToString(); } System.IO.File.WriteAllText("d:\\test.txt", savetext.ToString()); } } 选项设置为true。