mysql - Rails 3- 嵌套对象形式(重用地址模型)

标签 mysql ruby-on-rails activerecord

我无法解决这个问题。

我有一个业务模型和一个地址模型。为了让事情变得更复杂,我还有一个位置模型。一个企业可以有多个地点,但只有一个邮寄地址。

这是一个简单的对象图表。

商业
-姓名
-邮寄地址

位置
-商务
-姓名
-地址

我想为企业和地点重用地址模型。我需要为此做什么。如果有帮助,我正在使用 MySQL。

首先我该如何构建模型?我需要 has_many :location,:business (用于位置/业务)吗? 那么如何将用于创建地址的表单嵌套到新的业务/位置表单中。

谢谢!

最佳答案

我将从一些基本的模型代码开始,然后转到 Controller ,然后是 View 。

首先是模型:

#app/models/business.rb
class Business < ActiveRecord::Base
  has_one :mailing_address, :class_name => "Address", :dependent => :destroy
  accepts_nested_attributes_for :mailing_address

  has_many :locations
  accepts_nested_attributes_for :locations
end

#app/models/location.rb
class Location < ActiveRecord::Base
  has_one :address, :dependent => :destroy
  accepts_nested_attributes_for :address

  belongs_to :business
end

#app/models/address.rb
class Address < ActiveRecord::Base
  belongs_to :business
  belongs_to :location
end

现在 Controller 的新 Action :

#app/controllers/businesses_controller.rb#new
def new
  @business = Business.new

  mailing_address = @business.build_mailing_address
  3.times do
    location = @business.locations.build
    address = location.build_address
  end
  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @business }
  end
end

最后的观点:

#app/views/businesses/_form.html.erb
<%= form_for(@business) do |f| %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <%= f.fields_for :mailing_address do |builder| %>
    <h3>Mailing Address</h3>
    <%= render "address_fields", :f => builder %>
  <% end %>
  <%= f.fields_for :locations do |builder| %>
    <h3>Location</h3>
    <%= render "locations_fields", :f => builder %>
    <%= builder.fields_for :address do |mini_builder| %>
      <h3>Location Address</h3>
      <%= render "address_fields", :f => mini_builder %>
    <% end%>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

地址部分:

#app/views/businesses/_address_fields.html.erb
<p>
  <%= f.label "Street Address"%>
  <%= f.text_field :street %>
  <%= f.label "City"%>
  <%= f.text_field :city %>
  <%= f.label "State"%>
  <%= f.text_field :state %>
  <%= f.label "Zip"%>
  <%= f.text_field :zip %>  
</p>

位置部分:

#app/views/businesses/_location_fields.html.erb
<p>
  <%= f.label "Location Name"%>
  <%= f.text_field :name%>
</p>

整个过程中有几个比较棘手的部分。您必须记住,在 Controller 中构建 has_one 和 has_many 子对象是不同的方法。此外,您需要为邮寄地址关系正确定义类。

如果您想从与企业地址关联的位置集合中填充企业邮寄地址,那么您可以在业务模型中添加一个方法来执行如下操作:

#app/models/business.rb#possible_mailing_addresses
def possible_mailing_addresses
  Location.where(:business_id=>self.id).joins(:address)
end

关于mysql - Rails 3- 嵌套对象形式(重用地址模型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4164171/

相关文章:

ruby-on-rails - 使用新的Rspec语法测试CanCan中的功能

ruby-on-rails - 使用ActiveRecord,有没有办法在after_update期间获取记录的旧值

ruby-on-rails - 使用 Ruby On Rails 生成 URL (url_for)

ruby-on-rails - 为什么 Sidekiq 不关闭旧连接?

ruby-on-rails - ActiveRecord 中的表名损坏错误

mysql - 索引: '[column]' 的默认值无效

mysql - 流错误,同时尝试在 Compress::Raw::Zlib::_deflateInit 中初始化 deflate 对象

MySQL 存储过程 - 嵌套循环出错?

mysql - 如何计算 MySQL/正则表达式替换器中的单词?

javascript - JavaScript 函数的行为出现问题 `return this`