【问题标题】:Create model instance from child form从子窗体创建模型实例
【发布时间】:2013-02-06 16:26:05
【问题描述】:

我有一个属于 :city :state 和 :country 的 User 模型。

一个城市模型属于一个州。

一个国家模型属于一个国家。

当用户注册时,他们应该能够选择一个位置(城市州和国家/地区),或者如果该位置不在数据库中,则添加一个。问题是,在添加城市和州时,我希望能够将它们分别与他们的州或国家相关联。我目前拥有的是这个

在我的用户模型中

belongs_to  :state 
belongs_to  :city
belongs_to  :country     

def city_name
  city.try(:name)
end

def city_name=(name)
  self.city = City.find_or_create_by_name(name.titleize) if name.present?
end

def country_name
  country.try(:name)
end

def country_name=(name)
  self.country = Country.find_or_create_by_name(name.titleize) if name.present?
end

def state_name
  state.try(:name)
end

def state_name=(name)
  self.state = State.find_or_create_by_name(name.titleize) if name.present?
end

在我的用户/新表单中

<div class="field">
  <%= f.label :your_city %><br />
  <%= f.text_field :city_name, data: {autocomplete_source: cities_path} %>
  <br /> or <%= link_to "add New Location" ,"javascript:toggleDiv('hideme');"%>
</div>
<div id="log"></div>

<div id="hideme">
  <div class="field">
    <%= f.label :country_name %><br />
    <%= f.text_field :country_name %>
  </div>

  <div class="field">
    <%= f.label :state_name %><br />
    <%= f.text_field :state_name %>
  </div>
</div>

通过这种方式,我创建了一个用户并将其与一个城市州和国家/地区相关联 但是城市国家和国家是浮动的,与它们各自的国家和国家母公司没有关联。有没有办法在创建用户时关联这些模型?我应该放弃这种方法吗?

【问题讨论】:

  • 让一个用户属于一个城市、一个城市有很多用户、一个城市属于一个州、一个州有很多城市、一个州属于一个国家和一个国家是否更有意义?国家有很多州?据我了解,关系必须是双向的。如果某事物属于_其他事物,则其他事物必须拥有_一个或拥有_许多事物。
  • @BradRice 就是这样设置的

标签: ruby-on-rails ruby


【解决方案1】:

我认为这样做的地方应该是 before_save 钩子(或者 before_create,如果城市、州和国家永远不会改变)。

可能是这样的:

class User < ActiverRecord::Base
  before_save :city_state_country_setup

  ...

  private

  def city_state_country_setup
    self.state.update_attributes(country_id: self.country.id)
    self.city.update_attributes(state_id: self.state.id)
  end
end

但我建议您重新考虑数据的结构。您有可能导致模型之间发生冲突的冗余链接。例如。如果你改变了用户的状态,但不改变他或她所在城市的状态,那么用户所在的状态和用户所在城市的状态就会发生冲突。

解决此问题的一种方法是通过更紧密的关联来定义用户的州或国家/地区:

class User
  belongs_to  :city

  #New accessor methods for state and country
  def state
    @state ||= self.city.state
  end

  def state=(s)
     self.city.state = s
  end

  def country
    @country ||= self.state.country
  end

  def country=(c)
     self.state.country = c
  end

  ...

end

这样,用户、城市、州和国家/地区之间的关系仅在一个地方定义,这使得它们不太容易发生冲突。这种方法唯一需要注意的是,您必须确保在创建用户时,在尝试添加州之前创建城市,并且在国家之前创建州。您可以在控制器中执行此操作,也可以在 before_save 挂钩中再次执行此操作。

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 2011-04-26
    相关资源
    最近更新 更多