【问题标题】:set instance variable equal to only specific model parameters将实例变量设置为仅等于特定模型参数
【发布时间】:2019-01-09 19:03:17
【问题描述】:
def place
  @place = Activity.find(params[:id])
end

我将如何选择特定的参数?我们有 activity.address1,2, zip state 等,只需要一个我们可以使用的实例变量,它等于地址属性。

【问题讨论】:

  • 抱歉,我无法理解您的问题。您会尝试改写或添加一些您需要的示例吗?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

可以执行以下操作:

def place
  @place ||= Activity.find(params[:id])
  @address_attributes = @place.attributes.slice('address_1', 'address_2', 'zip', 'state')
end

在这种情况下,您将拥有一个实例变量,其中包含指定属性的哈希值,您可能会使用如下内容:

@address_attributes['address_1']

就个人而言,我发现在键值周围键入'' 很烦人,并且更喜欢使用符号。在这种情况下,您可能会执行以下操作:

def place
  @place ||= Activity.find(params[:id])
  @address_attributes = @place.attributes.with_indifferent_access.slice(:address_1, :address_2, :zip, :state)
end

你会使用类似的东西:

@address_attributes[:address_1]

但是,即使是括号和符号也有点烦人。所以,你可能会做这样的事情:

def place
  @place ||= Activity.find(params[:id])
  @address_attributes = OpenStruct.new(@place.attributes.with_indifferent_access.slice(:address_1, :address_2, :zip, :state))
end

然后你可以使用类似的东西:

@address_attributes.address_1

现在,就个人而言,我不喜欢 place 方法中的那条长线,所以我很想这样做:

def place
  @place ||= Activity.find(params[:id])
  @address_attributes = get_address_attributes
end

private

def get_address_attributes
  OpenStruct.new(
    @place.
      attributes.
      with_indifferent_access.
      slice(
        :address_1, 
        :address_2, 
        :zip, 
        :state
      )
  )
end

现在,如果这一切都在控制器中,并且您设置 @address_attributes 变量只是为了在视图中使用它,那么也许这已经足够了。

但是,如果您在当前实例的其他地方使用 @address_attributes 变量,那么您可能会考虑执行以下操作:

attr_accessor *%w(
  address_attributes
).freeze

delegate *%w(
  address_1
  address_2
  zip
  state
), to: :address_attributes, prefix: place

def place
  @place ||= Activity.find(params[:id])
  @address_attributes = get_address_attributes
end

private

def get_address_attributes
  OpenStruct.new(
    @place.
      attributes.
      with_indifferent_access.
      slice(
        :address_1, 
        :address_2, 
        :zip, 
        :state
      )
  )
end

在这种情况下,您可以拨打以下电话:

place_address_1

这似乎比类似的更好:

@address_attributes['address_1']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多