我们最近按照Rails指南中的步骤将Rails升级到5.1,但发现以下步骤不起作用.我有以下模型定义

class User < ActiveRecord::Base
  has_many :members, :dependent => :destroy
  has_many :user_accounts, :dependent => :destroy
end

class Member < ActiveRecord::Base
  belongs_to :user
  has_many :user_accounts, :through => :user
end

class UserAccount < ActiveRecord::Base
  belongs_to :user
end

例如,当我试图执行

user = User.find 109
member = user.members[0]
member.user_accounts

this generates the following query

SELECT `user_accounts`.* FROM `user_accounts` INNER JOIN `users` ON `user_accounts`.`user_id` = `users`.`id` WHERE `user_accounts`.`users` = NULL

正在对用户进行NULL次判断

它应该是users.id,即109.

值得一提的是,相同的Member型号与使用through的其他型号有其他关系.例如

member.stores
member.credit_cards

member.user_accounts美元并不管用.

如果你能帮我解决这个问题,那就太好了,谢谢.

推荐答案

我觉得我必须把这个放在这里:

:through Specifies an association through which to perform the query. This can be any other type of association...
https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many.


我已经建立了模型,就像你展示的那样,工作得很好:

>> Member.first.user.user_accounts
=> #<ActiveRecord::Associations::CollectionProxy [#<UserAccount id: 1, user_id: 1>]>

# through: user
>> Member.first.user_accounts
Member Load (0.8ms)  SELECT  `members`.* FROM `members` ORDER BY `members`.`id` ASC LIMIT 1
UserAccount Load (0.9ms)  SELECT  `user_accounts`.* FROM `user_accounts` INNER JOIN `users` ON `user_accounts`.`user_id` = `users`.`id` WHERE `users`.`id` = 1 LIMIT 11
=> #<ActiveRecord::Associations::CollectionProxy [#<UserAccount id: 1, user_id: 1>]>

以下是我是如何打破它的:

class AddUsersToUserAccounts < ActiveRecord::Migration[5.1]
  def change
    add_column :user_accounts, :users, :integer
  end
end
>> Member.first.user_accounts
Member Load (0.8ms)  SELECT  `members`.* FROM `members` ORDER BY `members`.`id` ASC LIMIT 1
UserAccount Load (0.7ms)  
  SELECT  `user_accounts`.* FROM `user_accounts` 
  INNER JOIN `users` ON `user_accounts`.`user_id` = `users`.`id` 
  WHERE `user_accounts`.`users` = NULL LIMIT 11
#                        ^
# using `users` column instead
=> #<ActiveRecord::Associations::CollectionProxy []>
>> UserAccount.column_names
=> ["id", "user_id", "users"]
>> Member.first.user_accounts.arel.ast.cores[0].wheres[0].children[0].to_sql
=> "`user_accounts`.`users` = ?"

当构建users.id = 1 where子句时,arel获取散列{"users"=>{"id"=>1}}并输出一些SQL.如果存在users列,它会偶然发现这一部分,并将"users"键视为列而不是表:

when value.is_a?(Hash) && !table.has_column?(column_name)
#                         ^^^^^^^^^ this one ^^^^^^^^^^^^

100

当我回滚并删除users列时,它进入正确的分支并构建一个工作的SQL:

>> UserAccount.column_names
=> ["id", "user_id"]
>> Member.first.user_accounts.arel.ast.cores[0].wheres[0].children[0].to_sql
=> "`users`.`id` = ?"

Ruby-on-rails相关问答推荐

在PDF生成中渲染 colored颜色

Sidekiq with Rails - 控制台与 rake 任务中的不同 Sidekiq 实例

如何为 I18n 设置 raise_on_missing_translations

如何在 Ruby on Rails 中正确存储 BigDecimal

'elseif' 还存在吗?

查找日期时间与今天匹配的记录 - Ruby on Rails

Rails 中页面视图的简单计数器

水豚 click_link 与 :href 匹配

机械师 vs FactoryGirl - 优点和缺点

Rails 服务对象与 lib 类

如何在 rspec 测试中输出变量?

Rails:仅当值存在时如何验证格式?

使用 oauth 和 twitter ruby​​ gem 时不断收到 OAuth::Unauthorized 错误

如何将变量 link_to 定义为外部 URL

Rails:立即渲染并退出

如何在 ROR (Ruby) 中显示 PDF?

Rails Rake 任务 - 访问模型类

如果多态关联的类型列不指向 STI 的基本模型,为什么多态关联对 STI 不起作用?

在 GIT 中处理 Rails db/schema.rb 文件的正确方法是什么?

没有UTC的Rails 3默认日期时间格式