【问题标题】:Rails 4 Composite Keys Returning Invalid Column Name ErrorRails 4复合键返回无效列名错误
【发布时间】:2015-07-14 09:43:51
【问题描述】:

我正在一个 Ruby on Rails 应用程序中创建一个问卷数据模型,该应用程序需要复合主键和外键。对于这个任务,我将composite-primary-keys gem 与 SQLServer 一起使用,这是我过去使用过的配对。不幸的是,我在使用组合进行查找时遇到了问题,无论是指定 .find([x,y,z]) 还是使用 belongs_to 关系定义的方法。 有趣的是,不过,它通过 has_many 定义的关系正常运行。我的模型如下(错误将在这篇文章的底部):

class QuestionSet < ActiveRecord::Base
  self.primary_keys = :question_set_id, :generation, :language_id
  has_many :question_set_questions,
      foreign_key: [:set_id, :set_generation],
      primary_key: [:question_set_id, :generation]
  has_many :questions, through: :question_set_questions
end

class QuestionSetQuestion < ActiveRecord::Base
  belongs_to :question_set,
      -> { where :language_id => Language.current_language.id },
      foreign_key: [:set_id, :set_generation],
      primary_key: [:question_set_id, :generation]
  belongs_to :question,
      -> { where :language_id => Language.current_language.id },
      foreign_key: [:question_id, :question_generation],
      primary_key: [:question_id, :generation]
end

class Question < ActiveRecord::Base
  self.primary_keys = :question_id, :generation, :language_id
  has_many :question_set_questions,
      foreign_key: [:question_id, :question_generation],
      primary_key: [:question_id, :generation]
  has_many :question_sets, through: :question_set_questions
end

如果模型需要解释,QuestionSet 和 Question 各有一个复合主键,由三个整数组成:question_ 或 question_set_ id、generation 和 language_id。它们受 QuestionnaireSetQuestion 约束,其中包含 id 和分组数字,并使用当前选择的语言(通过Language.current_language.id)来实现正确的记录。

什么有效?

如果我这样说:

qs = QuestionSet.first
qs.questions

然后一切正常,我看到了我期望的确切结果。我已经对此进行了非常彻底的测试,很多问题,很多问题集,很多语言,很多分组。在 QuestionSet 上调用 .questions 效果很好。它也适用于其他方式,...

q = Question.first
q.question_sets

...每次都返回正确的结果。

此外,在问题或问题集上调用 .question_set_questions 可以正常工作。

什么不起作用?

如果我说...

qsq = QuestionSetQuestion.first
qsq.question
# or
qsq.question_set

...我收到一个错误。当我说:

Question.find([1,1,1])
# or
QuestionSet.find([1,1,1])

那个错误如下:

EXEC sp_executesql N'SELECT  [questions].* FROM [questions] WHERE ([questions].[question_id] = @0 AND [questions].[generat
ion] = @1 AND [questions].[language_id] = @2)  ORDER BY [questions].[question_id,generation,language_id] ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY',
 N'@0 int, @1 int, @2 int', @0 = 1, @1 = 1, @2 = 1  [["question_id", 1], ["generation", 1], ["language_id", 1]]
TinyTds::Error: Invalid column name 'question_id,generation,language_id'.: EXEC sp_executesql N'SELECT  [questions].* FROM [questions] WHERE ([ques
tions].[question_id] = @0 AND [questions].[generation] = @1 AND [questions].[language_id] = @2)  ORDER BY [questions].[question_id,generation,langu
age_id] ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY', N'@0 int, @1 int, @2 int', @0 = 1, @1 = 1, @2 = 1
ActiveRecord::StatementInvalid: TinyTds::Error: Invalid column name 'question_id,generation,language_id'.: EXEC sp_executesql N'SELECT  [questions]
.* FROM [questions] WHERE ([questions].[question_id] = @0 AND [questions].[generation] = @1 AND [questions].[language_id] = @2)  ORDER BY [question
s].[question_id,generation,language_id] ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY', N'@0 int, @1 int, @2 int', @0 = 1, @1 = 1, @2 = 1
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-sqlserver-adapter-4.2.3/lib/active_record/connection_adapters/sqlser
ver/database_statements.rb:336:in `each'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-sqlserver-adapter-4.2.3/lib/active_record/connection_adapters/sqlser
ver/database_statements.rb:336:in `handle_to_names_and_values_dblib'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-sqlserver-adapter-4.2.3/lib/active_record/connection_adapters/sqlser
ver/database_statements.rb:325:in `handle_to_names_and_values'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-sqlserver-adapter-4.2.3/lib/active_record/connection_adapters/sqlser
ver/database_statements.rb:300:in `_raw_select'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-sqlserver-adapter-4.2.3/lib/active_record/connection_adapters/sqlser
ver/database_statements.rb:295:in `block in raw_select'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract_adapter.rb:466:
in `block in log'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activesupport-4.2.0/lib/active_support/notifications/instrumenter.rb:20:in `instr
ument'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract_adapter.rb:460:
in `log'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-sqlserver-adapter-4.2.3/lib/active_record/connection_adapters/sqlser
ver/database_statements.rb:295:in `raw_select'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-sqlserver-adapter-4.2.3/lib/active_record/connection_adapters/sqlser
ver/database_statements.rb:244:in `sp_executesql'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-sqlserver-adapter-4.2.3/lib/active_record/connection_adapters/sqlser
ver/database_statements.rb:19:in `exec_query'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-sqlserver-adapter-4.2.3/lib/active_record/connection_adapters/sqlser
ver/database_statements.rb:199:in `select'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/database_statem
ents.rb:32:in `select_all'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/query_cache.rb:
70:in `select_all'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/querying.rb:39:in `find_by_sql'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/relation.rb:638:in `exec_queries'
... 1 levels...
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/relation.rb:243:in `to_a'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/relation/finder_methods.rb:487:in `find_take
'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/relation/finder_methods.rb:105:in `take'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/composite_primary_keys-8.1.0/lib/composite_primary_keys/relation/finder_methods.r
b:124:in `find_one'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/composite_primary_keys-8.1.0/lib/composite_primary_keys/relation/finder_methods.r
b:97:in `find_with_ids'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.2.0/lib/active_record/relation/finder_methods.rb:71:in `find'
        from c:in `find'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/composite_primary_keys-8.1.0/lib/composite_primary_keys/core.rb:26:in `find'
        from (irb):1
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands/console.rb:110:in `start'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands/console.rb:9:in `start'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands/commands_tasks.rb:68:in `console'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
        from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/railties-4.2.0/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'irb(main):

很抱歉,这真是一团糟。 我相信正确的重点是

TinyTds::Error: Invalid column name 'question_id,generation,language_id'

据我所知,它试图找到一个名为“question_id,generation,language_id”的实际列,但由于显然不存在这样的列而失败。我怀疑其他命令起作用的原因是因为它们从这三个字段中构建了一个 .where 语句,而这是滥用 .find。也就是说,我只是根据我观察到的行为进行推测。

如果有人对此有任何想法,我将非常感激,因为事实证明这是一个重大的时间问题,我还没有找到任何关于它的信息。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby sql-server ruby-on-rails-4 composite-key


    【解决方案1】:

    我在没有在数据库中定义主键的表中遇到了同样的问题。我在这里创建了一个问题 - https://github.com/composite-primary-keys/composite_primary_keys/issues/316 - 并且还发布了一个对我有用的修复程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-18
      • 2019-02-03
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多