Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
Mysql Rails关联和外键混淆,我的外键应该是什么?_Mysql_Ruby On Rails_Ruby On Rails 3_Model Associations - Fatal编程技术网

Mysql Rails关联和外键混淆,我的外键应该是什么?

Mysql Rails关联和外键混淆,我的外键应该是什么?,mysql,ruby-on-rails,ruby-on-rails-3,model-associations,Mysql,Ruby On Rails,Ruby On Rails 3,Model Associations,我似乎不明白这个协会应该如何看待和运作。我知道我不太喜欢rails的命名约定,但我获取数据的源数据库也不是,我没有自由更改主键,因为它们也与真实的源数据库相关,我使用ETL将其加载到我的rails数据库中 这些是我的模型: class Eclass < ActiveRecord::Base has_many :elinks, :foreign_key => :concept_id has_many :eproperties, :through => :elinks en

我似乎不明白这个协会应该如何看待和运作。我知道我不太喜欢rails的命名约定,但我获取数据的源数据库也不是,我没有自由更改主键,因为它们也与真实的源数据库相关,我使用ETL将其加载到我的rails数据库中

这些是我的模型:

class Eclass < ActiveRecord::Base
  has_many :elinks, :foreign_key => :concept_id
  has_many :eproperties, :through => :elinks
end

class Elink < ActiveRecord::Base
  belongs_to :eclass, :foreign_key => :concept_id
  belongs_to :eproperty, :foreign_key => :pconcept_id
end

class Eproperty < ActiveRecord::Base
  has_many :elinks, :foreign_key => :pconcept_id
  has_many :eclasses, :through => :elinks
end
下面是我得到的错误,看起来active record正在执行一个列名为空的查询:

irb(main):002:0> @eclass.eproperties
  ←[1m←[35mEproperty Load (0.0ms)←[0m  SELECT `eproperties`.* FROM `eproperties`
 INNER JOIN `elinks` ON `eproperties`.`` = `elinks`.`pconcept_id` WHERE `elinks`
.`eclass_id` IS NULL
Mysql2::Error: Unknown column 'elinks.eclass_id' in 'where clause': SELECT `epro
perties`.* FROM `eproperties` INNER JOIN `elinks` ON `eproperties`.`` = `elinks`.`pconcept_id` WHERE `elinks`.`eclass_id` IS NULL
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'elinks.eclass_id'
 in 'where clause': SELECT `eproperties`.* FROM `eproperties` INNER JOIN `elinks` ON `eproperties`.`` = `elinks`.`pconcept_id` WHERE `elinks`.`eclass_id` IS NULL
我想返回给定类的属性

更新:我为每个答案添加了外键声明。但仍然收到了类似的错误。这是新的错误


在Elinks类中,我认为您需要将外键添加到关系中:

has_many :elinks, :foreign_key => :concept_id

我认为您需要为每个表设置正确的主键,所以我认为应该是这样的

class Eclass < ActiveRecord::Base
  set_primary_key :concept_id
  has_many :elinks, :foreign_key => :concept_id
  has_many :eproperties, :through => :elinks
end

class Elink < ActiveRecord::Base
  belongs_to :eclass, :foreign_key => :concept_id, :primary_key => :concept_id
  belongs_to :eproperty, :foreign_key => :pconcept_id, :primary_key => :pconcept_id
end

class Eproperty < ActiveRecord::Base
  set_primary_key :pconcept_id
  has_many :elinks, :foreign_key => :pconcept_id
  has_many :eclasses, :through => :elinks
end

我相信您只需要为has\u多个关联指定外键,就像您为belish\u to关联指定外键一样。在错误中,它希望在elinks.eclass\u id上加入,而不是在elinks.concept\u id上加入。另外,非常抱歉您一直使用的命名约定!事实上,我的遗留数据库的命名很糟糕,我们的遗留应用程序是原始的,有很多普通的HTMl和SQL。有时会让我哭。你能再看看这个吗@Tom L,我添加了外键,但没有用。你是说Eclass类吗?刚才注意到ID列是varchar类型的。这是非常糟糕的,可能是问题的原因,尽管理论上ActiveRecord不应该在意,而是将其留给数据库来生成错误。我会手动尝试SQL查询,因为将varchar连接到ID确实不应该起作用。我没有使用任何INT ID列作为主键或外键,我所有的连接键都是varchar。不过,表描述并不是这样说的,每个表ID都是int11。ActiveRecord只将外键连接到AFAIK主键。实际的mysql模式需要匹配这些声明吗?不,它只是让rails知道它应该如何连接表。mysql中不需要实际的外键,rails就可以设置表关系。您可能不需要在Elink类中指定primary_key,因为它在相应的类中声明了它们,但我将它放在那里以防它起作用。
has_many :elinks, :foreign_key => :concept_id
class Eclass < ActiveRecord::Base
  set_primary_key :concept_id
  has_many :elinks, :foreign_key => :concept_id
  has_many :eproperties, :through => :elinks
end

class Elink < ActiveRecord::Base
  belongs_to :eclass, :foreign_key => :concept_id, :primary_key => :concept_id
  belongs_to :eproperty, :foreign_key => :pconcept_id, :primary_key => :pconcept_id
end

class Eproperty < ActiveRecord::Base
  set_primary_key :pconcept_id
  has_many :elinks, :foreign_key => :pconcept_id
  has_many :eclasses, :through => :elinks
end