установить переменную экземпляра равной только конкретным параметрам модели - PullRequest
0 голосов
/ 09 января 2019
def place
  @place = Activity.find(params[:id])
end

Как бы я выбрал конкретные параметры? У нас есть активность.адрес1,2, состояние zip и т. Д., И нам просто нужна переменная экземпляра, которую мы можем использовать, которая равна только атрибутам адреса.

1 Ответ

0 голосов
/ 09 января 2019

Вы могли бы сделать что-то вроде:

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...