Есть ли способ ввести ассоциацию на лету для рельсов? - PullRequest
1 голос
/ 09 мая 2011

Так, например, у меня есть модель Guest,

Хотя я использую модель Guest для какого-либо действия, id хотел бы добавить эту ассоциацию (только для этого действия)

ОВАкатегория

Как мне это сделать?

Ответы [ 3 ]

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

Теоретически, возможно, это возможно, но в вашем случае это невозможно.Поскольку belongs_to является проблемой базы данных, это означает, что одна из таблиц базы данных имеет идентификатор для другой таблицы.ActiveRecord просто оборачивает все эти функциональные возможности, а затем создается впечатление, что вы взаимодействуете с объектами Ruby.Таким образом, вы не можете временно изменить свою базу данных, а затем вернуться на лету по разумной цене.

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

Хотя я согласен с @Beerlington, что вы, возможно, пытаетесь быть слишком умным, вот ответ:

  1. Создайте такой модуль:

    module Categorical
        def self.included(included_class)
          included_class.instance_eval do
              # from here to the end of this block, imagine that you are in the class
              # source itself. Add associations or instance methods, for example
    
              belongs_to :category
          end
        end
    end
    
  2. Теперь включите этот модуль в свой класс:

    class Guest < ActiveRecord::Base
        include Categorical
        ....
    
    end
    

И вот, у вас есть!

Это может быть полезно, если вы тожедобавление named_scopes в ваш класс Категорий или другие вспомогательные методы ...

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

Похоже, вы пытаетесь немного поумнеть с вашим кодом.Хотя это и возможно сделать, но это не встроенная функция, и, скорее всего, она привнесет много хакерского метапрограммирования и, следовательно, некоторые потенциально неприятные ошибки.Я бы рекомендовал сделать шаг назад и посмотреть, сможете ли вы переосмыслить проблему, которую пытаетесь решить.Вы используете контроллеры RESTful?Трудно сказать, основываясь на вашем вопросе, но обычно вы отвечаете «нет», когда начинаете задавать подобные вопросы.У вашего контроллера слишком много логики?Возможно, кое-что из того, что вы пытаетесь сделать, можно перенести на модели.Если вы предоставите больше информации о том, что вы делаете, вы, вероятно, получите больше полезных ответов.

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