Проблема со устаревшей ассоциацией ActiveRecord в Rails 3 - PullRequest
0 голосов
/ 09 марта 2011

У меня есть три модели: сайт, подписка, план:

Сайт

has_one     :subscription
has_one     :plan, :through => :subscription

Подписка

belongs_to  :site
belongs_to  :plan

План

has_many  :subscriptions

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

@site = current_user.site
@subscription = @site.subscription
@plan = @subscription.plan

К сожалению, если @ subscription.plan изменяется и сохраняется до POST, то это изменение не отражается в @site, если я не выполню @ site.reload в начале моего метода контроллера.

ех.

eval @subscription
> #<Subscription id: 6115, site_id: 5634, plan_id: 342, ... <== GOOD

eval @site.plan
> #<Plan id: 337, ... <== BAD

eval @subscription.site.plan
> #<Plan id: 342, ... <=== GOOD

eval @site.reload
eval @site.plan
> #<Plan id: 342,... <== GOOD

Есть идеи?

UPDATE

Ниже приведены два жизнеспособных ответа, но я не буду соглашаться на принятие любого из них, пока не узнаю больше о «сенсорном» варианте, который упоминал Джесси (который, к сожалению, не работает для меня ... .yet).

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Вы можете добиться успеха с помощью метода: touch в ваших отношениях.

Общая идея заключается в том, что если я обновлю комментарий, то будет обновляться и запись updated_at.Я думаю, это переведет вашу запись @site в память.

class Site
  has_one     :subscription, :touch=>true
  has_one     :plan, :through => :subscription, :touch=>true

class Subscription

  belongs_to  :site, :touch=>true
  belongs_to  :plan, :touch=>true

Когда вы обновите свой site.subscription.plan, это обновит подписку и план.

Дополнительная информация:http://ryandaigle.com/articles/2009/4/20/what-s-new-in-edge-rails-touching

0 голосов
/ 09 марта 2011

Это просто, как разработана Active Record. Он старается не обращаться к вашей базе данных слишком часто и предпочитает читать из памяти, чем базу данных.

Желательно, чтобы вы изменяли План через Сайт, а не отдельно от него. По сути, если вы читаете через @site, вы должны также писать через @site.

Если это невозможно или нежелательно, вам может потребоваться небольшой вспомогательный метод, проверяющий столбец updated_at, чтобы увидеть, изменилась ли запись, и перезагружающий сайт, если он это сделал. Если это звучит бестактно, это потому, что так и есть. :)

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