Ruby on rails 行为怪异的活动记录
问题:以下代码是否有问题 控制器测试 上面的操作将检索我查询的行 但是下面我试图从上面获取x.owner\u id的数据,但失败了,显然owner\u id是上面返回的查询中的一列Ruby on rails 行为怪异的活动记录,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,问题:以下代码是否有问题 控制器测试 上面的操作将检索我查询的行 但是下面我试图从上面获取x.owner\u id的数据,但失败了,显然owner\u id是上面返回的查询中的一列 irb(main):005:0> x.owner_id NoMethodError: undefined method `owner_id' for #<Notations::ActiveRecord_Relation:0x007fb83cecf288> from /Users/progra
irb(main):005:0> x.owner_id
NoMethodError: undefined method `owner_id' for #<Notations::ActiveRecord_Relation:0x007fb83cecf288>
from /Users/programmer/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.8/lib/active_record/relation/delegation.rb:136:in `method_missing'
from /Users/programmer/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.8/lib/active_record/relation/delegation.rb:99:in `method_missing'
from (irb):5
from /Users/programmer/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/railties-4.2.8/lib/rails/commands/console.rb:110:in `start'
from /Users/programmer/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/railties-4.2.8/lib/rails/commands/console.rb:9:in `start'
from /Users/programmer/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/railties-4.2.8/lib/rails/commands/commands_tasks.rb:68:in `console'
from /Users/programmer/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/railties-4.2.8/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
from /Users/programmer/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/railties-4.2.8/lib/rails/commands.rb:17:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
您正在调用ActiveRecord::Relation上的属性,而必须在Notations实例上调用它 注意:鉴于上面的代码必须适合您,我建议按照ruby标准进行一些更改 模型名称必须是单数符号,而不是符号 列名必须使用小写的owner\u id,而不是owner\u id
您正在调用ActiveRecord::Relation上的属性,而必须在Notations实例上调用它 注意:鉴于上面的代码必须适合您,我建议按照ruby标准进行一些更改 模型名称必须是单数符号,而不是符号 列名必须使用小写的owner\u id,而不是owner\u id
我发现了问题。db的列名为大写,因此:
y = x.owner_id # failure
y = x.OWNER_ID # success
irb(main):004:0> x.OWNER_ID
=> "00003"
解决方案:
使用初始值设定项使用小写模式反射:
ActiveRecord::ConnectionAdapters::SQLServerAdapter.lowercase_schema_reflection = true
所以现在:
x = Notations.all.first
irb(main):002:0> x = Notations.all.first
/Users/programmer/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-sqlserver-adapter-4.2.18/lib/active_record/connection_adapters/sqlserver/database_statements.rb:354: warning: :timezone option must be :utc or :local - defaulting to :local
Notations Load (1.9ms) EXEC sp_executesql N'SELECT [notation].* FROM [notation] ORDER BY [notation].[owner_id] ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'
irb(main):003:0> x.owner_id
=> "00003"
irb(main):004:0>
正如您在上面看到的,添加初始值设定项有效,它将列更改为小写。我同意把我的专栏放在小写的位置。但是我无法更改它们,因为此数据库与我公司的ERP系统一起使用我发现了问题。db的列名为大写,因此:
y = x.owner_id # failure
y = x.OWNER_ID # success
irb(main):004:0> x.OWNER_ID
=> "00003"
解决方案:
使用初始值设定项使用小写模式反射:
ActiveRecord::ConnectionAdapters::SQLServerAdapter.lowercase_schema_reflection = true
所以现在:
x = Notations.all.first
irb(main):002:0> x = Notations.all.first
/Users/programmer/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-sqlserver-adapter-4.2.18/lib/active_record/connection_adapters/sqlserver/database_statements.rb:354: warning: :timezone option must be :utc or :local - defaulting to :local
Notations Load (1.9ms) EXEC sp_executesql N'SELECT [notation].* FROM [notation] ORDER BY [notation].[owner_id] ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'
irb(main):003:0> x.owner_id
=> "00003"
irb(main):004:0>
正如您在上面看到的,添加初始值设定项有效,它将列更改为小写。我同意把我的专栏放在小写的位置。但是,我无法更改它们,因为此数据库与我公司的ERP系统一起使用仍然不起作用我发现了原因@Deepak MahakaleI在下面回答了它与区分大小写有关你知道ActiveRecord是否可以忽略大小写吗@Deepak MahakaleThat仍然不起作用我发现了它的原因@Deepak MahakaleI在下面回答说它与区分大小写有关你知道ActiveRecord是否可以忽略大小写吗@Deepak MahakaleWhy您希望所有人都返回一个特定实例?它返回所有符号的列表。您不能在列表上调用owner_id,必须首先选择一个特定的符号-例如,第一个:Notation.first这是我的错,我从终端上截取了错误的命令,应该是x=Notations.all.first@spickermannowy为什么用大写字母命名列,而不遵循Rails惯例?为什么希望所有列都返回一个特定实例?它返回所有符号的列表。你不能在列表中调用owner_id,你必须首先选择一个特定的符号-例如,first:notation.first这是我的错,我从终端上截取了错误的命令,它应该是x=Notations.all.first@spickermannw你为什么用大写字母命名列而不遵循Rails惯例?这是问题的答案吗?还是另一个问题?我已经建议,上面我会说,如果这是一个新的代码,请遵循标准,以避免未来的灾难这是一个问题的答案吗?还是另一个问题?我已经建议上面我会说,如果这是一个新的代码,请遵循标准,以避免将来发生灾难