我想创建一个多对多的关系与轨道has_many通过:但不是使用模型主键(id)我需要使用不同的列创建关系。 这里是我的模型(顺便说一句,我使用Rails 4):Rails has_many:通过与:primary_key
class Food < ActiveRecord::Base
validates :NDB_No, uniqueness: true
validates :NDB_No, :FdGrp_Cd, :Long_Desc, :Shrt_Desc, presence: true
has_many :langual_factor_associations, primary_key: 'NDB_No', foreign_key: 'NDB_No'
has_many :langual_factor_descriptions, through: :langual_factor_associations, primary_key: 'NDB_No', foreign_key: 'NDB_No'
end
class LangualFactorAssociation < ActiveRecord::Base
validates :NDB_No, :Factor_Code, presence: true
belongs_to :food, foreign_key: 'NDB_No'
belongs_to :langual_factor_description, foreign_key: 'Factor_Code'
end
class LangualFactorDescription < ActiveRecord::Base
validates :Factor_Code, uniqueness: true
validates :Factor_Code, :Description, presence: true
has_many :langual_factor_associations, primary_key: 'Factor_Code', foreign_key: 'Factor_Code'
has_many :foods, through: :langual_factor_associations, primary_key: 'Factor_Code', foreign_key: 'Factor_Code'
end
与LangualFactorAssociation该协会的has_many工作正常用于食品和LangualFactorDescription。但has_many通过:Food和LangualFactorDescription之间的关联不起作用。这里是我的错误,当我尝试访问Food.LangualFactorDescriptions:
Food::should create the proper relations to the LangualFactorDescription
model#test_0002_must create the proper associations:
ActiveRecord::StatementInvalid: PG::Error: ERROR: operator does not exist: integer = character varying
LINE 1: ...sociations" ON "langual_factor_descriptions"."id" = "langual...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT "langual_factor_descriptions".* FROM "langual_factor_descriptions" INNER JOIN "langual_factor_associations" ON "langual_factor_descriptions"."id" = "langual_factor_associations"."Factor_Code" WHERE "langual_factor_associations"."NDB_No" = $1 ORDER BY "langual_factor_descriptions"."id" ASC LIMIT 1
test/models/food_test.rb:172:in `block (3 levels) in <top (required)>'
我认为这个问题是查询的这部分ON“langual_factor_descriptions”,“ID” =“langual_factor_associations”“Factor_Code”。 。我认为设置primary_key和/或foreign_key选项会解决这个问题,但事实并非如此。事实上,如果我从模型中删除这些,只是把它像
has_many :langual_factor_descriptions, through: :langual_factor_associations
导轨产生完全相同的查询,所以在我看来,设置这些选项不做任何事。我在这里错过了什么吗?任何想法如何我可以告诉轨道不寻找langual_factor_descriptions.id而是langual_factor_descriptions.Factor_Code?
下面是一些最相关的资源,我看了一下这个话题: http://guides.rubyonrails.org/association_basics.html
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
has_many :through with :primary_key on join table not working(其实这就是我有问题,但我不知道这是正确的解决方案)
Rails has_many association with multiple keys
https://www.ruby-forum.com/topic/139765
Has Many Through Alternative Primary and Foreign Keys
我不确定,您可以尝试在模型LangualFactorDescription中使用self.primary_key ='Factor_Code' – yxf
好吧!但我有一个问题:即使DB中的主键仍然是id,是否可以将该字段定义为模型中的主要字段? – Jose
我认为这是好的,我认为'primary_key'告诉ActiveRecord哪个字段将用于连接另一个表。 – yxf