有没有更好的方法来执行这样的事情?

时间:2014-03-29 10:40:55

标签: ruby-on-rails ruby

我试图列出所有用户产品的可能关联,其中有一个标记'通知'设置为零。

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

3 个答案:

答案 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解决这个问题,但整个操作都可以重构。