【问题标题】:Rails association with wrong classRails 关联错误的类
【发布时间】:2019-01-22 16:22:28
【问题描述】:

我需要一些帮助,

我对模型A::B有以下关联

# Model A::B
belongs_to :B

当我尝试在数据库中创建/插入 A::B 的新实例时

# test.log
Processing by A::BController#create as HTML
Parameters: {"a_b"=>{"b_id"=>"128"}}
  BEGIN
    A::B Load (0.4ms) SELECT  "a_b".* FROM "a_b" WHERE "a_b"."id" = $1 LIMIT [["id", 128], ["LIMIT", 1]]
  ROLLBACK

如您所见,我正在回滚,因为 Rails 在错误的类中搜索(A::B 而不是 B),因此它没有在数据库中找到正确的元素。视图中生成的错误信息是B is required

# schema.rb
create_table "a_b", force: :cascade do |t|
    t.bigint "b_id"
    t.index ["b_id"], name: "index_a_b_on_b_id"
end

add_foreign_key "a_b", "b"

我认为问题与使用的名称有关。出于某种原因,Rails 在查找关联时考虑将A::BB 相同。

我已经尝试在关联中传递选项class_name: 'B',但它仍然使用了错误的类。

为了澄清,类的真实名称是:

A => edital
B => cargo
A::B => edital_cargo # (using namespace)

从 Rails 控制台:

# The association for the class Edital::Cargo

Edital::Cargo.reflect_on_association(:cargo)
=> #<ActiveRecord::Reflection::BelongsToReflection:0x00005588f76e6f60 @name=:cargo, @scope=nil, @options={:class_name=>"Cargo"}, @active_record=Edital::Cargo (call 'Edital::Cargo.connection' to establish a connection), @klass=nil, @plural_name="cargos", @type=nil, @foreign_type=nil, @constructable=true, @association_scope_cache=#<Concurrent::Map:0x005588f76e6588 entries=0 default_proc=nil>>

# Below, how Rails generate the names (@element and @human are equal for both)

ActiveModel::Name.new(Cargo)
=> #<ActiveModel::Name:0x00007fc6285f2a80 @name="Cargo", @klass=Cargo (call 'Cargo.connection' to establish a connection), @singular="cargo", @plural="cargos", @element="cargo", @human="Cargo", @collection="cargos", @param_key="cargo", @i18n_key=:cargo, @route_key="cargos", @singular_route_key="cargo">

ActiveModel::Name.new(Edital::Cargo)
=> #<ActiveModel::Name:0x00007fc6285d28c0 @name="Edital::Cargo", @klass=Edital::Cargo (call 'Edital::Cargo.connection' to establish a connection), @singular="edital_cargo", @plural="edital_cargos", @element="cargo", @human="Cargo", @collection="edital/cargos", @param_key="edital_cargo", @i18n_key=:"edital/cargo", @route_key="edital_cargos", @singular_route_key="edital_cargo">

有人已经面临这个问题了吗?我只能在选项class_name 中考虑可以指定模型的地方。

【问题讨论】:

  • 这是已知的 Rails 自动加载与 Ruby 的恒定分辨率相结合的副作用。您应该能够使用A 内部的scope resolution operator 来引用B 而不是A::B
  • @coreyward maaan,太快了!谢谢!有用!如果你愿意,我可以接受你的回答。

标签: ruby-on-rails associations


【解决方案1】:

这是 Rails 的自动加载与 Ruby 的恒定分辨率相结合的已知副作用。您应该可以使用A 内部的scope resolution operator 来引用B 而不是A::B

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多