Ruby on rails 为什么我会得到';关联类型不匹配';错误

Ruby on rails 为什么我会得到';关联类型不匹配';错误,ruby-on-rails,relational-database,Ruby On Rails,Relational Database,我的Rails“seeds.rb”文件中有以下代码: acondigitaladdresslineone = Addressline.create!(address_id: acondigitaladdress.id, address: "Sørkedalsveien 273", address_line_position: 0) “Address”模型与“Addressline”模型有一对多的关系,并且相应的“归属”和“has-many”声明正确就位。以下是迁移文件的内容: class Cr

我的Rails“seeds.rb”文件中有以下代码:

acondigitaladdresslineone = Addressline.create!(address_id: acondigitaladdress.id, address: "Sørkedalsveien 273", address_line_position: 0)
“Address”模型与“Addressline”模型有一对多的关系,并且相应的“归属”和“has-many”声明正确就位。以下是迁移文件的内容:

class CreateAddresses < ActiveRecord::Migration[5.0]
  def change
    create_table :addresses do |t|
      t.references :towncity, foreign_key: true
      t.references :stateregion, foreign_key: true, null: true
      t.references :postalcode, foreign_key: true

      t.timestamps
    end
  end
end

class CreateAddresslines < ActiveRecord::Migration[5.0]
  def change
    create_table :addresslines do |t|
      t.references :address, foreign_key: true
      t.string :address
      t.integer :address_line_position

      t.timestamps
    end
  end
end
我通过以下更改更正了错误:

# From the 'CreateAddresslines' migration file

    # Original code
    t.string :address

    # Revised code
    t.string :address_name

# From the 'acondigitaladdresslineone' variable declaration line

    # Original code
    address: "Sørkedalsveien 273"

    # Revised code
    address_name: "Sørkedalsveien 273"
我怀疑错误的原因可能是基础数据库(在本例中是SQLite)无法根据数据类型消除相同字段名的歧义。例如,在“CreateAddresslines”迁移文件的原始版本中,SQLlite由于以下两个声明而引发错误:

t.references :address, foreign_key: true
t.string :address
在编码过程中很容易忽略明显的问题。显然,关系数据库表不能有两个或多个同名列。我不知道有任何关系数据库管理系统能够根据数据类型的差异消除相同命名表列的歧义

我需要精神检查。这是提出“AssociationTypeMismatch”错误的合理假设吗


谢谢。

t.references:address
将创建列
address\u id
,因此在数据库级别上应该与
t.string:address
没有冲突

当声明访问器和关联时,ActiveRecord中会出现此问题

ActiveRecord从数据库中读取模式,并使用它在模型中为每个列创建属性和访问器方法。这发生在对类声明块中的任何代码求值之前

然后创建关联时,将覆盖为字符串属性创建的
#address
#address=
方法

class Addressline
  belongs_to :address 
end
这就是为什么当你这样做的时候:

Addressline.new(address: 'Foo')
由于
#address=
setter方法正在设置
address\u id
并需要一个地址实例,因此会出现类型错误

正如您可能猜测的那样,解决方案是不要将其他列命名为与您的关联相同的名称。只需重命名该列:

class FixColumnName < ActiveRecord::Migration
  def self.change
    # call it whatever you want, but not address!
    rename_column :addresslines, :address, :value
  end
end
class-FixColumnName
>t.references:address将创建列地址\u id。。。是的,你说得对。这是我忽略的另一点。>由于#address=setter方法正在设置>address\u id,并且需要一个address实例,因此会出现类型错误。有趣的谢谢
class FixColumnName < ActiveRecord::Migration
  def self.change
    # call it whatever you want, but not address!
    rename_column :addresslines, :address, :value
  end
end