我试图列出所有用户产品的可能关联,其中有一个标记'通知'设置为零。
user.probable_associations.where(:notified => 0).collect{|a| Product.where(:id => a.product_id).collect{|p| p.name}}.to_sentence
似乎在声明中使用where和collect方法两次并不是很好。有没有更好的方法来解决这个问题?
此外,结果类似于
"[\"Product A\"] and [\"Product B\"]"
这非常难看......我仍然需要删除额外的标点符号" [\" \"] 而不是像
那样干净的东西"Product A and Product B"
基于Rich的答案编辑,仍有问题,因为通知是协会中的字段而非产品:
has_many :probable_associations, -> { where "associations.category = 3"}, class_name: 'Association', before_add: :set_probable_category
has_many :probable_products, class_name: 'Product', through: :probable_associations, source: :product do
def not_notified
select(:name).where(notified: 0)
end
end
答案 0 :(得分:1)
我使用ActiveRecord Association extension:
#app/models/user.rb
Class User < ActiveRecord::Base
has_many :products do
def not_notified
select(:name).where(notified: 0)
end
end
end
#-> @user.products.not_notified
这是我的贡献,但您可以使用@spickermann
&amp; @tompave
的骚扰并使用.flatten.to_sentence
答案 1 :(得分:0)
在不知道probable_associations
会做什么的情况下,我会将代码重写为:
product_ids = user.probable_associations.where(:notified => 0).map(&:product_id)
Product.where(:id => product_ids).map(&:name).to_sentence
答案 2 :(得分:0)
假设probable_associations
只是一个ActiveRecord has_many
关联,并且您希望最终得到Product
条记录的标题列表,则可以使用此功能:
ids = user.probable_associations
.where(notified: 0)
.pluck(:product_id)
result = Product.where(id: ids).pluck(:name).to_sentence
它类似于@spikermann的答案,但pluck(:column_name)
比使用块更快,只从数据库中提取所需的列。
此外,您的代码生成该字符串的原因是,当您调用to_sentence
时,您拥有Array
个子数组。每个子数组包含一个元素:产品名称。
这是因为第二个collect
被发送到只包含一条记录的ActiveRecord::Relation
。
你可以用flatten
解决这个问题,但整个操作都可以重构。