переопределение значения на true и установка остальных на false в рельсах - PullRequest
0 голосов
/ 11 ноября 2009

это действительно глупый вопрос, но у меня есть крайний срок, и я очень нервничаю, и я попробовал все. На самом деле это даже работало на секунду, но я, должно быть, что-то сломал.

У меня есть элемент по умолчанию, который я хочу переопределить каждый раз, когда пытаюсь добавить другой элемент. Раньше у меня было сообщение об ошибке, но я не хочу, чтобы оно было ошибочным, я просто хочу, чтобы оно установило все на false, а это приложение на true.

Я перепробовал все, перед сохранением, после сохранения / обновления именованных областей, сопоставления каждой из них с ложным, а затем сохранения, проверки наличия изменений в функции ... Я думаю, что у меня есть все нужные части, но я могу ' положить их вместе. Пожалуйста, помогите пожалуйста: (

Может быть, для этого есть даже быстрая проверка, я не уверен

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

Существует логическая настройка для элемента, который называется is_featured.

Когда вы создаете элемент, вы можете установить его как функцию или нет.

Если в базе данных есть другие элементы, их следует обнулить, а элемент, который был только что обновлен или создан для отображения, должен иметь значение true.

Я пробовал это в модели с до / после / сохранить / обновить, а также контроллер при создании и обновлении

Хорошо, я добавлю немного моего глупого кода, который я не знаю, почему не работает

В контроллере:

  if params[:app][:is_on_front_page] == true
App.all.map{|m|( m != @app ) ? m.is_on_front_page = true : m.is_on_front_page = false}

конец

или

  named_scope :is_on_front_page, :conditions => { :is_on_front_page => true }
    after_update do
    if self.is_on_front_page.changed? and App.is_on_front_page.count >= 1
     App.all.map{|m| m.is_on_front_page = false;m.save}

    end 
    is_on_front_page = true
    save!
   end

но это не позволит мне сохранить или войти в бесконечный цикл, или кричит на меня из-за названной области видимости

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

В транзакции просто установите для всех значение false и затем обновите нужную запись (признакам). Это похоже на то, как иногда легче удалить записи, затем найти их и обновить их. То есть проще сделать что-то вроде:

Сделай так SomeModel.delete_all items.each {| i | SomeModel.create (i)} конец

Что может быть проще, чем зациклить SomeModel, выполнив поиск (), а затем обновив определенные свойства.

В вашем случае вы просто хотите пометить ВСЕ записи как НЕ рекомендуемые, а затем просто обновить ту, которая вам нужна, а не включать вручную записи.

Попробуйте что-то вроде этого:

after_create :set_as_featured

def set_as_featured
 self.class.transaction do
   self.connection.execute("UPDATE foo SET featured=0")
   self.update_attribute(:featured, true)
 end
end
1 голос
/ 11 ноября 2009
if params[:id]  # or however you're setting the overridden featured item
  @feature = Feature.find(params[:id])
else
  @feature = Feature.default  # make a self.default method that returns the default
end

Это то, что тебе нужно? Чтобы выбрать рекомендуемый товар?

Я не уверен, что именно вам нужно. Проверки будут для сохранения чего-либо, поэтому я не уверен, что там будет «показано». Комментарий для разъяснения поможет.

В хуке before_create или before_update вы могли бы установить значения по умолчанию, если что-то не было предоставлено, но помимо этого мне понадобилось бы небольшое руководство относительно ваших особенностей.

0 голосов
/ 11 ноября 2009

Хорошо, я добавляю отдельный ответ, потому что я думаю, что понимаю, что вы говорите.

У вас есть список предметов, и вы хотите, чтобы один из них был представлен. Кто-то может выбрать один из них для показа, но если нет, то есть запасной элемент, который будет выбран по умолчанию.

Если у вас есть Store has_many: items, вы можете поместить в хранилище атрибут «featured_item_id» и сохранить featured_id. Если вам нужно установить значение по умолчанию, добавьте "default_item_id" и поместите туда значение по умолчанию.

Добавить отношения для них в Магазине:

belongs_to :featured_item, :class => Item, :foreign_key => 'featured_item_id'
belongs_to :default_item,  :class => Item, :foreign_key => 'default_item_id'

Затем создайте метод, который проверяет и возвращает правильный:

def featured
  if self.featured_item_id
    self.featured_item
  else
    self.default_item
  end
end

Если вы установите предмет в качестве избранного, вы его получите. Если нет, вы получите по умолчанию. Вы, вероятно, также хотите:

validates_presence_of :default_item_id

... чтобы всегда было значение по умолчанию, чтобы у вас не возникало проблем с нулевым элементом.

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