Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在使用Rails ActiveAdmin时,是否可能有一个只有两个主键的联接表?_Ruby On Rails_Activerecord_Ruby On Rails 4_Activeadmin - Fatal编程技术网

Ruby on rails 在使用Rails ActiveAdmin时,是否可能有一个只有两个主键的联接表?

Ruby on rails 在使用Rails ActiveAdmin时,是否可能有一个只有两个主键的联接表?,ruby-on-rails,activerecord,ruby-on-rails-4,activeadmin,Ruby On Rails,Activerecord,Ruby On Rails 4,Activeadmin,我可以在ActiveAdmin中编辑联接表,前提是联接表只有一个主键(id) 如果我试图设计一个只有两个字段(两个字段上都有主键)的联接表,那么当我尝试为nil:NilClass添加一个新记录时,ActiveAdmin将返回一个NilClass错误:未定义的方法“人化” 型号: class IngredientProduct < ActiveRecord::Base belongs_to :product belongs_to :ingredient end class Ingr

我可以在ActiveAdmin中编辑联接表,前提是联接表只有一个主键(id)

如果我试图设计一个只有两个字段(两个字段上都有主键)的联接表,那么当我尝试为nil:NilClass添加一个新记录时,ActiveAdmin将返回一个NilClass错误:
未定义的方法“人化”

型号:

class IngredientProduct < ActiveRecord::Base
  belongs_to :product
  belongs_to :ingredient
end

class Ingredient < ActiveRecord::Base
end

class Product < ActiveRecord::Base
end
那不行。我的“配料产品”表必须按以下方式设计:

id --> primary key, nn, integer
product_id --> integer
ingredient_id --> integer
允许我使用ActiveAdmin编辑或添加记录

您知道ActiveAdmin是否支持只有两个字段的联接表,这两个字段都用于定义主键


我的项目:MySql、Rails 4.0.1以及ActiveRecord和ActiveAdmin 1.0.0。在这种情况下,
ID
实际上是主键,而
product\u ID
component\u ID
是外键,因为它们是引用另一个表主键的键。主键很重要,因为应该只有一个。但是,通过添加数据库约束,可以使两个外键的组合唯一

在迁移中,请执行以下操作:

add_index :ingredient_products, [:product_id, :ingredient_id], unique: true
如果您打算使用一个复合主键,我相信这个gem会达到这个目的


在这种情况下,
ID
实际上是主键,而
产品ID
成分ID
是外键,因为它们是引用另一个表主键的键。主键很重要,因为应该只有一个。但是,通过添加数据库约束,可以使两个外键的组合唯一

在迁移中,请执行以下操作:

add_index :ingredient_products, [:product_id, :ingredient_id], unique: true
如果您打算使用一个复合主键,我相信这个gem会达到这个目的


如果希望联接表没有
id
列,则需要完全省略模型文件(在本例中为IngredientProduct),并在两端使用
has\u和\u-beliens\u-many
。ActiveAdmin似乎能够编辑habtm关联:


如果希望联接表没有
id
列,则需要完全省略模型文件(在本例中为IngredientProduct),并在两端使用
has\u和\u-beliens\u-many
。ActiveAdmin似乎能够编辑habtm关联:


据我所知,您可以有多个列来“生成”主键:主键是唯一指定行的列的组合。我相信您的解决方案很好(谢谢),但我正试图避免更改表结构。您可能有一个复合主键(我认为),但我不认为它对性能特别好。所有目的和目的的索引都是相同的(因为组合是唯一的,主键必须是唯一的),并且根本不会更改表结构。它只是添加索引以提高性能。我可以问一下你为什么需要复合主键吗?这里有一些关于你想要什么的更多信息。如果这足够的话,如果你能接受我的回答,我将不胜感激。如果您需要更多信息,请告诉我。据我所知,您可以有多个列来“生成”主键:主键是唯一指定行的列的组合。我相信您的解决方案很好(谢谢),但我正试图避免更改表结构。您可能有一个复合主键(我认为),但我不认为它对性能特别好。所有目的和目的的索引都是相同的(因为组合是唯一的,主键必须是唯一的),并且根本不会更改表结构。它只是添加索引以提高性能。我可以问一下你为什么需要复合主键吗?这里有一些关于你想要什么的更多信息。如果这足够的话,如果你能接受我的回答,我将不胜感激。如果您需要更多信息,请告诉我。实际上,我认为手动将行添加到IngreditProduct表不是一个好主意。也许你有一个很好的理由,但我认为应该尽量避免。我不是ActiveAdmin的专家,你建议成分和产品之间的关联应该以产品或成分的形式进行?(如果是,你是怎么做到的?)这就是我的意思。因此,您有一个Products表单和一个Components表单,您可以为每个表单添加另一个Id的非必需字段,然后覆盖每个Id的create方法,这几乎就是全部。检查这里:在这里,我真的不认为手动向IngreditProduct表添加行是一个好主意。也许你有一个很好的理由,但我认为应该尽量避免。我不是ActiveAdmin的专家,你建议成分和产品之间的关联应该以产品或成分的形式进行?(如果是,你是怎么做到的?)这就是我的意思。因此,您有一个Products表单和一个Components表单,您可以为每个表单添加另一个Id的非必需字段,然后覆盖每个Id的create方法,这几乎就是全部。检查这里:这里