has_many:通过find_or_initialize_by中断

时间:2009-06-16 17:21:02

标签: ruby-on-rails has-many-through

我有一个模型Feed,它拥有并属于许多FilteredUsers。在这种情况下,我通过has_many:through relationship实现了它。

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?

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,因为它是has_many :through关系,初始化无法知道新denial应与哪个filtered_user相关联。如果您要使用find_or_initialize_by,则需要在与denial相关联的特定feed上运行它。

构建一个新的filtered_user并将其与特定的拒绝关联。

其次,同意ErsatzRyan,一般逻辑似乎有点偏。

答案 1 :(得分:0)

首先检查参数[: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

警告这是未经测试的空气编码

相关问题