创建Feed => NoMethodError:ActiveRecord_Associations_CollectionProxy的未定义方法

时间:2015-06-14 17:49:52

标签: ruby-on-rails rails-activerecord has-many-through model-associations rails-postgresql

我正在实施属于用户订阅的代码的所有卡片的Feed,我收到以下错误。它可能是微不足道的,但我无法确定需要什么工作。

NoMethodError:未定义的方法`卡'标签:: ActiveRecord_Associations_CollectionProxy:0x007fbaa46239f8>

以下是我的模特:

class User < ActiveRecord::Base
  has_many :cards, dependent: :destroy
  has_many :tags, through: :cards

  has_many :subscriptions, dependent: :destroy 
  has_many :subscribed_tags, through: :subscriptions, source: :tag
end
class Tag < ActiveRecord::Base
  has_many :taggings, dependent: :destroy
  has_many :cards, through: :taggings
  has_many :subscriptions, dependent: :destroy
  has_many :subscribers, through: :subscriptions, source: :user
end
class Card < ActiveRecord::Base
  acts_as_votable
  belongs_to :user
  has_many :taggings, dependent: :destroy
  has_many :tags, through: :taggings    
  def self.tagged_with(name)
    Tag.find_by_name!(name).cards
  end
  def self.tag_counts
    Tag.select("tags.*, count(taggings.tag_id) as count").
    joins(:taggings).group("taggings.tag_id")
  end
  def tag_list
     tags.map(&:name).join(", ")
  end
  def tag_list=(names)
    self.tags = names.split(",").map do |n|
       Tag.where(name: n.strip).first_or_create!
    end
  end
end

我真正想做的是运行current_user.subscribed_tags.cards并检索我可以重新排序并作为时间线输出的卡片阵列。

由于

1 个答案:

答案 0 :(得分:1)

subscribed_tags - 这是一个范围(where(user: self)),您可以在其上调用wherejoin,但不能调用项目方法。

在您的情况下,您想要使用scope

class Card
  scope :with_subscription, -> { joins(tags: :subscriptions) }
end

# In controller
current_user.cards.with_subscription.order('cards.created_at DESC')

您可以将current_user.cards想象成另一种形式的Cards.where(user: current_user)。一旦你告诉你将检索Card数组 - 它就无法更改。你不能只做user.cards.subscriptionsUser.where(id: user).cards.tags过滤器。

接下来我们使用joins(:subscriptions)进行过滤。它将为我们提供内部联接,因此我们获得属于具有订阅的用户的卡。这是我们可以进一步修改的范围,例如订单。

activerecord join associations