- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 KSUIDs作为我的 Rails 应用程序中 UUID 的替代品。 michaelherold/ksuid-ruby将 KSUID 移植到 Ruby 并将它们实现为 ::ActiveRecord::Type::String
.除了使用 has_many :through associations
时的一个小错误外,一切都运行良好结合 class_name
.
我能够创建两个 rspec 测试来演示该错误。
工作测试
https://github.com/mattes/ksuid-ruby/blob/e545b1b251bd6430c454509475963a7845b1da0f/spec/cast1_spec.rb#L50-L58
# code excerpt from link above
class Patient < ActiveRecord::Base
act_as_ksuid :id
has_many :appointments
has_many :physicians, through: :appointments
end
bundle exec rspec ./spec/cast1_spec.rb # works as expected, tests pass
class_name
时它会导致
TypeError: can't cast KSUID::Type
.
# code excerpt from link above
class Patient < ActiveRecord::Base
act_as_ksuid :id
has_many :foobar, class_name: "Appointment" # <---- using class_name here
has_many :physicians, through: :foobar
end
bundle exec rspec ./spec/cast2_spec.rb # test fails
TypeError:
can't cast KSUID::Type
# ./spec/cast2_spec.rb:59:in `block (2 levels) in <top (required)>'
git clone https://github.com/mattes/ksuid-ruby.git
cd ksuid-ruby
git checkout cast_error
bundle install
bundle exec rspec ./spec/cast1_spec.rb # works
bundle exec rspec ./spec/cast2_spec.rb # fails
最佳答案
这看起来像一个 Rails 错误。
解析 through
时-association ( patient.physicians
) rails 查找与连接表名称相同的关系,并且由于没有 - 回退到字符串类型转换(=不需要类型转换,因此错误)。
使示例工作的一个技巧是添加关系:
class Physician < ActiveRecord::Base
act_as_ksuid :id
has_many :foobar, class_name: "Appointment"
has_many :patients, through: :foobar
has_many :appointments # <= this is not used in app, but rails now can correctly resolve types
end
NotImplementedError: In order to correctly type cast Patient.id, Physician needs to define a :appointments association.
ksuid/activerecord/schema_statements
将类型添加到
PostgreSQLAdapter
不管实际的适配器是什么。
bundler/inline
和
minitest/autorun
创建一个独立的示例(只需
ruby filename.rb
即可运行):
require 'bundler/inline'
gemfile(ENV['INSTALL']=='1') do
source 'https://rubygems.org'
gem 'activerecord', '~>6.0.2' # also tested '~>5.2', '5.0' with same result, master with different error
gem 'sqlite3' # use , '~> 1.3.6' # for rails 5
gem 'ksuid', github: 'mattes/ksuid-ruby', ref:'e545b1b251bd6430c454509475963a7845b1da0f'
gem 'minitest'
end
require "active_record"
require "logger"
require "ksuid/activerecord"
require "ksuid/activerecord/table_definition"
# require "rails"
# require "ksuid/activerecord/schema_statements" # commented out to not load rails only to check Rails.env, instead:
require "active_record/connection_adapters/sqlite3_adapter"
::ActiveRecord::ConnectionAdapters::SQLite3Adapter::NATIVE_DATABASE_TYPES[:ksuid] = { name: "varchar", limit: 27 }
# require "ksuid/activerecord/quoting" # monkey-patch that fixes the error
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Base.logger = Logger.new(IO::NULL)
ActiveRecord::Schema.verbose = false
ActiveRecord::Schema.define do
create_table(:physicians, force: true, id: :ksuid)
create_table(:patients, force: true, id: :ksuid)
create_table(:appointments, force: true, id: :ksuid) {|t| t.ksuid :physician_id, :patient_id }
end
class Physician < ActiveRecord::Base
act_as_ksuid :id
has_many :foobar, class_name: "Appointment"
has_many :patients, through: :foobar
has_many :appointments # the hack
end
class Appointment < ActiveRecord::Base
act_as_ksuids :id, :physician_id, :patient_id
belongs_to :physician
belongs_to :patient
end
class Patient < ActiveRecord::Base
act_as_ksuid :id
has_many :appointments
has_many :physicians, through: :appointments
end
ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base)
require "minitest/autorun"
describe "ActiveRecord integration" do
it "loads all associations correctly" do
patient = Patient.create!
physician = Physician.create!
appointment = Appointment.create!(patient_id: patient.id, physician_id: physician.id)
expect(patient.id.class).must_equal KSUID::Type
expect(patient.physicians.first).must_equal physician
expect(physician.patients.first).must_equal patient
end
end
关于ruby-on-rails - Rails 自定义 ActiveRecord::Type 在 has_many 中使用 `class_name` 时失败:通过关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60242514/
我有一个具有以下模型的应用程序:- 类别- 子类别- 产品- 产品子类别 我的关系如下: Category has_many :subcategories Subcategory belongs_to
看来 rails 仍然不支持这种类型的关系并抛出 ActiveRecord::HasManyThroughAssociationPolymorphicThroughError 错误。 我该怎么做才能实
我想知道我可以在多大程度上使用 Rails 中的关联。考虑以下因素: class User :provider end class Provider :businesses belongs
我是 Rails 的新手。我想知道我是否需要将 add_index 添加到两个迁移? 我正在尝试定义用户和事件。每个用户可以有多个事件,每个事件可以有多个用户。所以我会做这样的事情: class Us
我有这个: class User :series end class Serial :serials end class Episode < ActiveRecord::Base belong
我一直致力于一个大量使用模型关联的项目,似乎我发现了 has_many 或 has_one through 功能与 :conditions 功能冲突的情况。简而言之,问题是 through 关联为 h
模拟以下情况的最佳方法是什么: Word belongs_to :wordable, :polymorphic => true Phrase has_many :words, :as => :
这似乎是一个典型的问题,但很难搜索。 我想选择用户通过 has_many 拥有的项目和用户通过 has_many through 关联的项目。 考虑以下模型: class User < ActiveR
首先对英语感到抱歉 所以我已经有了“用户 - 帖子”一对多关联,这意味着每个帖子只能有一个作者,现在我想在用户个人资料中添加“最喜欢的帖子”按钮,以及“添加到收藏夹”按钮每个帖子,所以问题是如何实现这
我有一个用户模型,允许用户关注其他用户。每个用户也有很多东西: class User has_many :following, :class_name => 'Followings', :fore
我正在使用 Rails 4.1 和 Ruby 2.1。 一个用户 has_many 辆车,和一辆车 has_many 约会。获取所有用户约会的最简单方法是什么? 理想情况下,我想做这样的事情:user
我想为 has_many/has_many 关系定义一个工厂(我想我做对了)但是我不知道如何为这些创建的工厂的每个对象定义属性。 这是主页,这是交易卡片的列表 我们假设下面的主页 View 是针对登录
我正在努力弄清楚如何实现这个计数。模型是用户、测试、等级 用户 has_many 测试,测试 has_many 成绩。 每个等级都有一个计算分数(strong_pass、pass、fail、stron
我有一个 has many through 关系来定义用户已回答的问题。 如何为用户创建的问题建立关系? 通常你会在用户和问题之间创建一个 has_many 和 belongs_to 关系,但是因为我
例如,在 class Student < ActiveRecord::Base has_many :awards end class Awards < ActiveRecord::Base b
我仍然在尝试如何处理在Ecto中创建/更新has_many, through:关联。我已经重新阅读了José's关于关联以及the docs的帖子,但我仍在努力。 我所拥有的是: 网站/模型/dish
# == Schema Information # # Table name: orders # # id :integer not null, pri
我正在尝试从 EventView.promoter_id = User.id 的用户获取事件,但它无法正常工作。这是我的设置(目前不正确): User has_many :events has_man
我有三门课 TeamMember , Service和ServiceTeamMember 我有 class Service has_many :service_team_members has
我需要列出所有用户及其销售的产品总量及其电子邮件和产品总量, class User :user).group('users.email').sum(:quantity) 关于mysql - 事件记录
我是一名优秀的程序员,十分优秀!