chr*_*o16 3 mysql activerecord ruby-on-rails
我无法解决这个问题.
我有一个商业模式和一个地址模型.为了使事情变得更复杂,我也有一个位置模型.企业可以有多个位置,但只有一个邮寄地址.
这是一个简单的对象图表.
业务
-Name
-MailingAddress
位置
-Business
-Name
-Address
我想重用业务和位置的地址模型.我需要做些什么呢.如果它有帮助,我正在使用MySQL.
首先我如何构建模型?我是否需要has_many:location,:business(适用于位置/业务)?然后,如何将用于创建地址的表单嵌套到新的业务/位置表单中.
谢谢!
我将从一些基本的模型代码开始,然后转到控制器,然后查看.
首先是模特:
#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
Run Code Online (Sandbox Code Playgroud)
现在控制器新动作:
#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
Run Code Online (Sandbox Code Playgroud)
最后意见:
#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 %>
Run Code Online (Sandbox Code Playgroud)
地址部分:
#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>
Run Code Online (Sandbox Code Playgroud)
位置部分:
#app/views/businesses/_location_fields.html.erb
<p>
<%= f.label "Location Name"%>
<%= f.text_field :name%>
</p>
Run Code Online (Sandbox Code Playgroud)
整个过程中有一些比较棘手的组件.您必须记住,构建has_one和has_many子对象是控制器中的另一种方法.此外,您需要为邮件地址关系正确定义类.
如果您希望从与业务地址关联的位置集合中填充业务邮件地址,那么您可以在Business模型中添加一个类似这样的方法:
#app/models/business.rb#possible_mailing_addresses
def possible_mailing_addresses
Location.where(:business_id=>self.id).joins(:address)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1149 次 |
| 最近记录: |