2

多くの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で回避する方法に関する提案はありますか?

ありがとう!

4

2 に答える 2

1

まず、これは関係であるため、初期化では newがどの関連付けられるべきかhas_many :throughを知る方法がありません。を使用する場合は、に関連付けられている特定の で実行する必要があります。denialfiltered_userfind_or_initialize_bydenialfeed

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

第二に、ErsatzRyan に同意すると、一般的な論理は少しずれているようです。

于 2009-11-08T23:19:28.137 に答える
0

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

これはエアコードであり、テストされていないことを警告します

于 2009-06-17T13:46:33.887 に答える