has_many: через перерывы на find_or_initialize_by - PullRequest
2 голосов
/ 16 июня 2009

У меня есть модель Feed, которая имеет и принадлежит ко многим FilteredUsers. В этом случае я реализовал это через отношение has_many: through.

class Feed < ActiveRecord::Base
  has_many :denials, :dependent => :destroy
  has_many :filtered_users, :through => :denials

Я хотел бы создать запись, если она не существует, или найти объект, если он существует. Когда я пытаюсь использовать find_or_initialize_by (или find_or_create_by), возникает исключение, говорящее undefined method 'feed_id=' for <FilteredUser..

Вот код:

feed = Feed.find(params[:id])
user = feed.filtered_users.find_or_initialize_by_user_url(params[:user_url])
if params[:status] == "block"
  feed.filtered_users << user
else
  feed.filtered_users.delete(user)
end
feed.save

Любые предложения о том, как это исправить или как обойти это сухо?

Спасибо!

Ответы [ 2 ]

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

Во-первых, поскольку это отношение has_many :through, инициализация не может определить, с каким denial новым filtered_user следует связать. Если вы хотите использовать find_or_initialize_by, вам нужно запустить его на определенном denial, связанном с feed.

Создайте нового Filter_user и свяжите его с определенным отказом.

Во-вторых, согласившись с ErsatzRyan, общая логика выглядит несколько не так.

0 голосов
/ 17 июня 2009

Не проще ли сначала проверить параметры [: status], а затем делать то, что нужно?

feed = Feed.find(params[:id])
if params[:status] == 'block'
   feed.filtered_users.build(:user_url => params[:user_url])
else
   feed.filtered_users.find_by_user_url(params[:user_url]).delete
end
feed.save

предупреждение о том, что воздушный код не проверен

...