gpt4 book ai didi

ruby - 在 Rails Admin 中配置正确的连接列

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:47 25 4
gpt4 key购买 nike

我有两个模型,它们通过 has_and_belongs_to_many 关系相互关联。

class Band < ActiveRecord::Base
has_and_belongs_to_many :stages, association_foreign_key: :stage_number
end

class Stage < ActiveRecord::Base
has_and_belongs_to_many :bands
end

假设两个表都有一个 id 字段,并且那个阶段有一个 stage_name 字段。

它们通过一个名为 bands_stages 的表相互关联,其架构类似于以下内容:

create_table :bands_stages, id: false do |t|
t.integer :band_id
t.integer :stage_number
end

我的意图是使用 Rails Admin 允许我们修改 Stage 上的某些字段,但每次运行时,我都会收到 SQL 错误:

column stages.id does not exist

Rails Admin 似乎默认选择了错误的列来加入。我要如何通知 Rails 管理员我希望它加入我的联接表中实际存在的列?

请注意,我实际上无法使用 stages 表中的 ID。目的是在任何给定时间只存在十个阶段,用阶段编号表示,但每个乐队都可以访问每个阶段。由于 ID 会自动递增,因此利用更具体的 :stage_number 字段似乎更安全、更明确。

最佳答案

我确定这不是 rails admin 的问题,而是 habtm association 的问题。要使 habtm 在 sql 中使用正确的列,必须为阶段模型指定主键,并为关联指定外键。这是使其正常工作的唯一方法。

class Stage < ActiveRecord::Base
self.primary_key = "stage_number"

has_and_belongs_to_many :bands, foreign_key: :stage_number
end

但我认为最好的方法是使用联合模型和 has_many/belongs_to,因为对于 has_many/belongs_to,可以通过 :primary_key 选项将任何列设置为主键。

class BandStageLink < ActiveRecord::Base
self.table_name = "bands_stages"

belongs_to :band
belongs_to :stage, foreign_key: :stage_number, primary_key: :stage_number
end
class Band < ActiveRecord::Base
has_many :band_stage_links
has_many :stages, through: :band_stage_links, foreign_key: :stage_number
end
class Stage < ActiveRecord::Base
has_many :band_stage_links, primary_key: :stage_number, foreign_key: :stage_number
has_many :bands, through: :band_stage_links
end

更新:请注意,在这种情况下,仍然不需要为阶段表指定任何主键。例如我的迁移是:

class CreateStageBandTables < ActiveRecord::Migration
def change
create_table :bands_stages, id: false do |t|
t.integer :band_id
t.integer :stage_number
end

create_table :bands do |t|
t.string :name
end

create_table :stages, id: false do |t|
t.integer :stage_number
t.string :name
end
end
end

我针对 Rails 4.2.5 测试了这两种情况,一切正常。

关于ruby - 在 Rails Admin 中配置正确的连接列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34703945/

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