我有一个模型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?

谢谢!

有帮助吗?

解决方案

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

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

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

其他提示

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