has_many:通过find_or_initialize_by中断
-
05-07-2019 - |
题
我有一个模型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
警告这是未经测试的空气编码
不隶属于 StackOverflow