0

这是我一直试图解决的问题,但我还没有找到一种感觉不像是彻头彻尾的黑客攻击的方法。我有 2 个对象,Warehouse 和 StateCity。Warehouse 对象具有指向 StateCity 对象 ( state_city_id ) 的外键。

现在,当用户创建仓库时,我希望他们能够输入州和城市。目前他们可以这样做,我只需检查提交的州和城市参数,然后创建或找到相应的 ActiveRecord 对象。现在,当他们在我的视图中查看 Warehouse 时,我在使用帮助程序从 StateCity 对象中提取 State/City(如果存在)和在我的模型上添加一个方法以执行如下相同的功能之间摇摆不定

def show_state( warehouse )
  if warehouse.state_city.nil? == false
    return warehouse.state_city.state
  end
  return ""
end

def show_city( warehouse )
  if warehouse.state_city.nil? == false
    return warehouse.state_city.city
  end
  return ""
 end

不幸的是,无论是辅助方法还是用额外的函数来增加模型看起来都不是很自然,因为我必须使用一个来创建对象,另一个来查看对象。

我想知道是否有人对解决 Warehouse-StateCity 问题的更好方法有任何建议。任何帮助是极大的赞赏。

4

1 回答 1

1

首先,您可以像这样编写 if 语句:

return warehouse.state_city.city unless warehouse.state_city.nil?

但我确定这不是您要寻找的答案。

我假设您总是希望 Warehouse 与 StateCity 相关联。如果是这种情况,那么您的用户总是需要在创建仓库时选择州和城市,并且该逻辑由您的控制器处理并由您的仓库模型验证。

如果您的所有验证都是正确的,那么您在 Warehouse 模型的 show 操作中需要做的就是从您的仓库中获取 StateCity 对象:

@state_city = warehouse.state_city

然后在您的视图中只需访问字段@state_city.state@state_city.city. 我不完全确定您是如何创建这些 StateCity 对象的,但这听起来很像您想要做的事情。

如果您的 state_city 为 nil,您可以根据要显示的内容以不同的方式处理它。如果您仍想显示仓库显示视图,那么在视图中您可以进行如下检查

<% if @state_city %>
  # Do something with the state city like display the state and city?
<% end %>

例如,如果您想告诉用户更新州城市,您可以通过以下方式从控制器处理

unless @state_city
  redirect_to "your edit action" and return
end

它将检查您的 state_city 是否为空,然后它将用户重定向到您想要的任何操作。

于 2012-12-13T03:24:17.277 回答