Как обновить модель соединения с помощью has_many: through? - PullRequest
2 голосов
/ 22 ноября 2010

У меня есть вопрос, касающийся отношений «многие ко многим», в частности has_many: через ассоциации.

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

Что я хочу сделать, это обновить временные метки таблицы объединения, когда уже добавленная статья снова добавляется, чтобы она перемещалась в верхнюю часть «списка». Как мне это сделать?

Вот как выглядит мое действие создания:

def create
  @article = Article.find_or_create_by_url(params[:article])
  if current_user.articles.find(@article)

      # update the timestamps on the join table 
      # ie moved the old article to the top

      flash[:notice] = "Successfully added article (again)."
      redirect_to @article
  else
    @article.users << current_user
    if @article.save
      flash[:notice] = "Successfully added article."
      redirect_to @article
    else
      render :action => 'new'
    end
  end
end

Заранее спасибо!

Обновление:

@ Бен Ли

Спасибо за ваш ответ, так как у меня есть has_many через ассоциацию, моя модель статьи выглядит так:

has_many :readinglist_items, :dependent => :destroy
has_many :users, :through => :readinglist_items

Так что я не знаю, смогу ли я добавить :touch => true к has_many, поскольку я просто хочу указать конкретную запись в таблице соединений.

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

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Если я правильно вас понимаю, это не проблема контроллера, а проблема модели. Вы можете указать :touch => true для отношения belongs_to. Это сделает так, что всякий раз, когда ребенок обновляется, update_at ассоциации хорошо обновляется.

Итак, поместите что-то подобное в вашу Article модель:

belongs_to :whatever, :touch => true

Кроме того, это касается тангенциально: из кода неясно, что именно делает ваш код, но может показаться, что вы добавляете функциональность create и update в метод create вместо разделения их на части соответственно.

1 голос
/ 22 ноября 2010

Я решил это! (readlist_item - это имя таблицы соединений):

def create
  @article = Article.find_or_create_by_url(params[:article])
  if current_user.articles.find(@article)

      @article.readinglist_items.find_by_user_id(current_user.id).touch

      flash[:notice] = "Successfully added article (again)."
      redirect_to @article
  else
    @article.users << current_user
    if @article.save
      flash[:notice] = "Successfully added article."
      redirect_to @article
    else
      render :action => 'new'
    end
  end
end
...