0

我有 2 个模型,更新它们时遇到错误。我使用了嵌套属性。

 class Channel < ActiveRecord::Base
    self.primary_key = 'id'

    has_many :channel_mappings , primary_key: 'channel_name', foreign_key: 'channel_name'

    attr_accessible :channel_name, :channel_mappings_attributes

    validates_presence_of :channel_name

    accepts_nested_attributes_for :channel_mappings, :allow_destroy => true
end

第二个模型

class ChannelMapping < ActiveRecord::Base
  self.primary_key = 'src_channel'

  belongs_to :channel, primary_key: 'channel_name', foreign_key: 'channel_name'

  attr_accessible :src_channel, :channel_name , :src_file_type 
end

更新方法

def update
        @channel = Channel.find(params[:id])

        if @channel.update_attributes(params[:channel])
            redirect_to @channel, notice: 'Channel was successfully updated.'
        else
            render action: 'edit'
        end
    end

错误

  Type: ActiveRecord::RecordNotFound
      Message:  Couldn't find ChannelMapping with ID=ANY NAME for Channel with ID=2

我知道这与覆盖主键有关。任何帮助都会很有用

数据库/schema.rb

create_table "channels", :force => true do |t|
    t.text    "channel_name",                                  :null => false
    t.string  "internal_flag",                  :limit => nil
    t.string  "exception_flag",                 :limit => nil
  end

create_table "channel_mappings", :id => false, :force => true do |t|
    t.text    "src_channel",   :null => false
    t.text    "channel_name",  :null => false
  end
4

2 回答 2

0

好吧,在 Channel.rb 的第一行中,您将主键设置为“id”。那么为什么要在关联中指定 primary_key='channel_name' 呢?这似乎是错误的。

此外,在 db/schema.rb 中查看您对通道表的定义也会很有帮助。

补充信息后更新

在您的要点中,我看到您的参数在 channel_mappings_attributes 中包含一个 id 键。但是,您的 schema.rb 显示 channel_mappings 没有 id。这是您需要解决的第一件事。

于 2013-03-21T12:50:31.927 回答
0

你可以尝试 -@channel.attributes = params[:channel]而不是@channel.update_attributes(params[:channel])

这也将设置所有属性,但不保存。

然后你可以打电话 -

@channel.save

这将保存您的属性。

该错误似乎是找不到记录,而不是像更新恢复一样。

首先检查错误日志,如果需要,如果没有任何效果,请在此处发布。

最好使用 if else 条件:

if @channel.save
#record saved
else
#error in save
end

然后你就可以知道它的去向。

于 2013-03-21T12:13:54.923 回答