gpt4 book ai didi

ruby-on-rails - ActiveScaffold::ReverseAssociationRequired 新记录创建错误

转载 作者:行者123 更新时间:2023-12-04 05:59:29 24 4
gpt4 key购买 nike

我有三个模型:

class LevelTwoArea < ActiveRecord::Base
has_many :places, dependent: :restrict
end

class Place < ActiveRecord::Base
belongs_to :level_two_area
has_many :producers, dependent: :restrict

validates_presence_of :level_two_area_id
end

class Producer < ActiveRecord::Base
belongs_to :place

validates_presence_of :place_id
end

我还有一个 Controller ,每个模型都有一个 ActiveScaffold。

问题是,当我想创建一个新的 Place 时,脚手架向日志吐出错误:
ActiveScaffold::ReverseAssociationRequired (Association producers: In order 
to support :has_one and :has_many where the parent record is new and the child
record(s) validate the presence of the parent, ActiveScaffold requires the
reverse association (the belongs_to).)

我不明白为什么...

请注意:
  • 其他类似的脚手架也能用
  • 我可以在控制台中创建记录和使用关联:
    >> Place.new name: 'PONVOGO', level_two_area_id: 10144
    => #<Place id: nil, name: "PONVOGO", latitude: nil, longitude: nil, producers_count: nil, level_two_area_id: 10144, created_at: nil, updated_at: nil, marker: nil>
    >> _.save
    => true
    >> Producer.first.place.producers
    => [#<Producer id: 1, name: "KOFFI YAO GREGOIRE", place_id: 43, created_at: nil, updated_at: nil>]
  • 当我删除 has_many :producers 时,问题就消失了,虽然关联宏看起来完全正常
  • 如果我删除 dependent: :restrict,问题不会消失选项
  • 我有一个 producers_census我的专栏 Place模型,我怀疑这会把事情搞砸,但希望在进行大量重构之前得到确认。从脚手架中移除此列不会解决问题。
  • places 上的字段 table :
    Column             |            Type             |                                  
    --------------------------------------------------
    id | integer | non NULL (PK)
    name | character varying(50) | non NULL
    latitude | double precision |
    longitude | double precision |
    producers_census | integer |
    level_two_area_id | integer | non NULL (FK)
    created_at | timestamp without time zone |
    updated_at | timestamp without time zone |
    marker | geometry |

    我的整个 PlacesController :
    class PlacesController < ApplicationController
    active_scaffold :place do |conf|
    conf.columns = :name,
    :level_two_area,
    :latitude,
    :longitude,
    :producers_census
    export.columns.add :id,
    :level_two_area_id

    [:latitude, :longitude].each {|column| conf.columns[column].options[:format] = "%.14f" }

    [
    create,
    update,
    delete,
    batch_update
    ].each do |action|
    action.link.security_method = :can_see_link?
    end
    batch_destroy.link.each {|sublink| sublink.security_method = :can_see_link? }

    end
    end

    我在 rails 上 (3.0.5)/active_scaffold_vho (3.0.17)/ruby​​ (1.9.2p180)

    最佳答案

    虽然我以前从未见过这个 ActiveScaffold 异常,但我认为这是怎么回事:

    反向关联设置为 :inverse_of选项,和 它的效果将仅可见 而记录未保存。这就是为什么您在控制台实验中看不到它的原因。

    尝试这个:

    place = Place.new
    => #<Place ...>
    producer = place.producers.build
    => #<Producer ...>

    producer.place
    => nil
    place.producers.first.place
    => nil

    当这些记录完全建立在内存中时,您的验证将失败。如果你从来没有同时建立一个地方和一个生产者,那么你就不必担心这个。但是,如果您这样做,则还应编写验证规则以检查 :place 是否存在。 (即对象),而不是 :place_id :
    validates_presence_of :place

    我不知道 ActiveScaffold 使用哪种构建/创建机制,但我猜如果他们抛出这个异常,他们可能会在内存中构建东西。

    因此,要解决此问题,请尝试:
    class Producer < ActiveRecord::Base
    belongs_to :place, inverse_of: producers

    validates_presence_of :place
    end

    class Place < ActiveRecord::Base
    has_many :producers, inverse_of: place
    end

    注意:ActiveRecord 过去不支持 :inverse_ofhas_many方面和该限制曾经在来源中评论过。从 Rails 3.1 开始,这似乎是固定的。如果你用 :inverse_of 修改你的类如图所示,然后使用内存对象的控制台实验应该返回关联的对象。

    您可能想在 bi-directional associations 上查看 Rails API 文档。

    关于ruby-on-rails - ActiveScaffold::ReverseAssociationRequired 新记录创建错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9096835/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com