質問

私は多くのFilteredUsersを持ち、それに属するモデルFeedを持っています。この場合、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

これを修正する方法またはそれを回避する方法に関する提案はDRYlyですか?

ありがとう!

役に立ちましたか?

解決

まず、has_many :through関係であるため、初期化では新しいdenialをどのfiltered_userに関連付ける必要があるかを知る方法がありません。 find_or_initialize_byを使用する場合は、feedに関連付けられている特定の<=>で実行する必要があります。

新しいfiltered_userを作成し、特定の拒否に関連付けます。

第二に、ErsatzRyanに同意して、一般的なロジックは少しずれているようです。

他のヒント

最初にparams [: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