Ruby on Rails 嵌套表单

问题描述 投票:0回答:2

我有三个模型:Deal、Zipcode、DealIncludeZipcode。

现在,关联如下所示:-

交易模式:

class Deal < ActiveRecord::Base
  has_many  :deal_include_zipcodes, dependent: :destroy
  has_and_belongs_to_many  :zipcodes, dependent: :destroy
  
  accepts_nested_attributes_for :deal_include_zipcodes,:reject_if => :reject_include_zipcodes, allow_destroy: true
  
  private
    def reject_include_zipcodes(attributes)
      if attributes[:deal_id].blank? || attributes[:zipcode_id].blank?
        if attributes[:id].present?
          attributes.merge!({:_destroy => 1}) && false
        else
          true
        end
      end
    end
end

class Zipcode < ActiveRecord::Base
  has_and_belongs_to_many :deals
end


class DealIncludeZipcode < ActiveRecord::Base
    belongs_to :deal
    belongs_to :zipcode
end

现在视图中有一个复选框,取消选中它后,我可以从 DealIncludeZipcode 中选择多个邮政编码。但是当我保存数据时它没有保存。

我已使用迁移来加入邮政编码和交易模型,其中我的排除邮政编码功能正常工作。

请提供解决方案。我尝试过各种方法但没有成功。

ruby-on-rails ruby-on-rails-4
2个回答
0
投票

has_and_belongs_to_many
的重点是你没有一个连接这两个部分的模型。

class Deal < ActiveRecord::Base
  has_and_belongs_to_many :zipcodes
end

class Zipcode < ActiveRecord::Base
  has_and_belongs_to_many :deals
end

将通过名为

deals_zipcodes
的“无头”表加入。如果您想要一个连接模型,您需要使用
has_many :through
来代替。

class Deal < ActiveRecord::Base
  has_many :deal_zipcodes, dependent: :destroy
  has_many :zipcodes, through: :deal_zipcodes
end

class DealZipcode < ActiveRecord::Base
  belongs_to :deal
  belongs_to :zipcode
end

class Zipcode < ActiveRecord::Base
  has_many :deal_zipcodes, dependent: :destroy
  has_many :deals, through: :deal_zipcodes
end

0
投票

我认为麦克斯是对的。所以你的迁移应该是

create_table :deals do |t|
  t.string :name
  ...
end
create_table :zipcodes do |t|
  t.string :zipcode
  ...
end
create_table :deals_zipcodes do |t|
  t.belongs_to :deal, index: true
  t.belongs_to :zipcode, index: true
end

你的模型应该是

class Deal < ActiveRecord::Base
  has_and_belongs_to_many :zipcodes
end
class Zipcode < ActiveRecord::Base
  has_and_belongs_to_many :deals
end

您可能应该查看 ActiveRecord 指南,您可以在其中找到更多说明。

© www.soinside.com 2019 - 2024. All rights reserved.