Есть ли более простой способ найти запись и вернуть один из ее атрибутов в Rails 3? - PullRequest
0 голосов
/ 13 мая 2011

Я снова и снова писал следующий фрагмент кода:

MyModel.find(my_id).my_field

Интересно, есть ли более простой способ написать это?

Ответы [ 3 ]

2 голосов
/ 13 мая 2011

Если вы спрашиваете, есть ли более краткий способ написания этого ... не уверен, что это так со стандартными искателями.То, что у вас есть, довольно мало.Просто для забавы я написал это для вас, хотя:)

class ActiveRecord::Base

  def self.method_missing_with_retrieve_just_a_field(method_called, *args, &block)
    if(method_called.to_s=~/get_/)
      self.find(args[0]).send(method_called.to_s.gsub("get_", ""))
    else
      method_missing_without_retrieve_just_a_field(method_called, *args, &block)
    end
  end

  class << self
    alias_method_chain :method_missing, :retrieve_just_a_field
  end
end

Если вы поместите это в свои конфиг / инициализаторы как какой-то файл, такой как crazy_finder.rb, вы можете просто сказать:

MyModel.get_my_field(my_id)

Это не сильно тебя спасает, но я просто подумал, что было бы интересно написать.

1 голос
/ 13 мая 2011

В дополнение к глобальному решению Джейка для каждой модели и каждого атрибута вы можете легко определить явные индивидуальные средства доступа:

class MyModel
  def self.my_field(id)
    find(id).my_field
  end
end

Или массив полей:

class MyModel
  class << self
    [:my_field, :other_field].each do |field|
      define_method field do |id|
        find(id).send(field)
      end
    end
  end
end
0 голосов
/ 13 мая 2011

Вы делаете это для одного и того же ресурса снова и снова или для множества различных ресурсов?Было бы очень полезно, если бы вы дали нам лучший пример того, что вы пытаетесь сделать, если вы делаете это много раз, это помогло бы привести нам пример того, что вы делаете много раз.

Если вы делаете это только для одного ресурса, чтобы получить разные значения:

Если вы делаете это в одном и том же действии снова и снова, вы делаете это неправильно.Сначала сохраните ваш результат в такой переменной:

@ mymodel = MyModel.find (id)

, а затем вы можете использовать

@mymodel.my_field

и затем снова (без необходимости искать его снова)

@mymodel.different_field

или еслиВы хотите сделать это для коллекции, которую вы можете сделать:

@ mymodels = MyModel.find ([my_first_id, my_second_id, my_third_id])

и т. д .. лучший примерс вашей стороны поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...