2016-08-29 117 views
1

Rails的5 PostgreSQL的的has_many,我这里有3种型号通过我的应用程序关联

class User < ApplicationRecord 
has_many :specialties, class_name: "Specialty", 
         foreign_key:"teacher_id", 
         dependent: :destroy 
has_many :subjects, through: :specialties, source: :subject 

class Specialty < ApplicationRecord 
belongs_to :teacher, class_name: "User" 
belongs_to :subject, class_name: "Subject" 

class Subject < ApplicationRecord 
has_many :teachers, through: :specialties, source: :teacher 
has_many :specialties, class_name: "Specialty", 
         foreign_key:"subject_id", 
         dependent: :destroy 

在我的rails控制台,以前当我使用的SQLite我有 user = User.first没有问题,那么user.subjects将返回我的所有用户科目。 但是经过我已经改变到PostgreSQL,它返回我

ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: operator does not exist: integer = character varying 
LINE 1: ...ects" INNER JOIN "specialties" ON "subjects"."id" = "special... 
                  ^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 
: SELECT "subjects".* FROM "subjects" INNER JOIN "specialties" ON "subjects"."id" = "specialties"."subject_id" WHERE "specialties"."teacher_id" = $1 

有什么方法可以让我做回了user.subjects? 我注意到,在遵循和遵循rails教程模型时没有发生这个问题。 (Twitter的模型)

谢谢

编辑,特色菜是不是一个整数列,我要改变它,回来非常感谢!

+0

'“特色菜”,“subject_id”“ - 这是一个整数列? – dp7

+0

哦,它不是! ,我下班后要把它放好。谢谢!! – Holmes

+0

't.string:subject_id' - 它是** String **类型,外键的类型应与您的主键相同,否则在比较它们时会出现类型转换错误 – dp7

回答

1

由于您的错误已经给提示:

HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

PostgreSQL是严密的关于类型的列进行比较。

看起来你有外键subject_id,teacher_id字符串类型。因此,当您比较类型为整数的主键与类型的外键字符串时,会出现此错误。

您可以更改列类型,以避免这个错误:

change_column :specialties, :subject_id, :integer 
change_column :specialties, :teacher_id, :integer 
+0

我正在寻找替代解决方案。我的一些模型使用主键是字符串,有些使用整数。为了实现这两个目标,我将我的association_id列设置为一个字符串,但我遇到了这个错误。 – BananaNeil

相关问题