Вопрос

У меня есть модель 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

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

Спасибо!

Это было полезно?

Решение

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

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

Во-вторых, соглашаясь с Эрзацряном, общая логика кажется немного неуместной.

Другие советы

Не проще ли было бы сначала проверить параметры [: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

предупреждение это воздушное обозначение не тестировалось

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top