Creating a feed => NoMethodError: undefined method for ActiveRecord_Associations_CollectionProxy
Creating a feed => NoMethodError: undefined method for ActiveRecord_Associations_CollectionProxy
我正在实施属于用户订阅的标签的所有卡片的提要,但出现以下错误。这可能是微不足道的事情,但我无法确定需要做什么。
NoMethodError: 未定义方法“卡片”Tag::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 并检索一组卡片,我可以重新排序并输出为时间线。
谢谢
subscribed_tags
- 这是一个作用域 (where(user: self)
),您可以对它们调用 where
或 join
,但不能调用项目方法。
在你的情况下你想使用 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.subscriptions
或 User.where(id: user).cards.tags
你唯一能做的就是过滤。
接下来我们用joins(:subscriptions)
过滤。它会给我们内部连接,所以我们得到属于有订阅的用户的卡片。这是我们可以进一步修改的范围,例如订单。
我正在实施属于用户订阅的标签的所有卡片的提要,但出现以下错误。这可能是微不足道的事情,但我无法确定需要做什么。
NoMethodError: 未定义方法“卡片”Tag::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 并检索一组卡片,我可以重新排序并输出为时间线。
谢谢
subscribed_tags
- 这是一个作用域 (where(user: self)
),您可以对它们调用 where
或 join
,但不能调用项目方法。
在你的情况下你想使用 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.subscriptions
或 User.where(id: user).cards.tags
你唯一能做的就是过滤。
接下来我们用joins(:subscriptions)
过滤。它会给我们内部连接,所以我们得到属于有订阅的用户的卡片。这是我们可以进一步修改的范围,例如订单。