如何更好地执行我的代码?

时间:2011-07-05 12:21:36

标签: ruby-on-rails ruby ruby-on-rails-3

我有这两段代码,我认为它们很难看。我怎样才能改变它们?

1

do_withs = Dowith.where(:friend_id => current_user.id)
@doweets = do_withs.collect { |f| f.doweet_id }
@doweets = @doweets.collect { |f| Doweet.find((F)) }
@doweets = @doweets + current_user.doweets 
@doweets.flatten!
@doweets.sort! { |a,b| a.date <=> b.date }

2

@current_user_doweets = current_user.doweets.limit(10)
@friendships = Friendship.where(:friend_id => current_user.id, :status => true)
@friends = @friendships.collect { |f| User.find(f.user_id) }
@friends_doweets = @friends.collect(&:doweets)
@doweets = @current_user_doweets  + @friends_doweets
@doweets.flatten!
@doweets.sort! { |a,b| b.created_at <=> a.created_at }

模型:

class Doweet < ActiveRecord::Base
  has_many :comments
  has_many :likes
  has_many :dowiths
  belongs_to :user
end

class Dowith < ActiveRecord::Base
  belongs_to :doweet
end

class User < ActiveRecord::Base
  has_many :doweets
  has_many :friendships
end

class Friendship < ActiveRecord::Base
  belongs_to :user  
end

3 个答案:

答案 0 :(得分:1)

这简化了一些事情(但我的语法可能会关闭......

@doweets = Dowith.where(:friend_id => current_user.id).collect do |d|
[
    Doweet.find(d.doweet_id)    
]
end

@doweets << current_user.doweets
@doweets.sort! do |a,b| a.date <=> b.date end

答案 1 :(得分:1)

1)利用模型关联减少使用includes方法急切加载生成的数据库查询的数量:

@doweets = Dowith.where(:friend_id => current_user.id).includes(:doweet).collect(&:doweet) + current_user.doweets
@doweets.sort! {|doweet1, doweet2| doweet1.date <=> doweet2.date}

2)非常类似于1:

@friends_doweets = Friendship.where(:friend_id => current_user.id, :status => true).includes(:user => :doweets).collect{|friendship| friendship.user.doweets}
@doweets = current_user.doweets.limit(10) + @friends_doweets
@doweets.sort! { |a,b| b.created_at <=> a.created_at }

观察您的日志文件,以查看发生的数据库查询数量的差异。这不是一个大问题,但我认为你可以从代码中消除很多实例变量,并用局部变量替换它们。应使用控制器操作中的实例变量将数据传递给视图。

答案 2 :(得分:0)

@doweets = Dowith.where(:friend_id => current_user.id).collect &:doweet_id
@doweets = Doweet.find_all_by_id(@doweets)
@doweets = (@doweets + current_user.doweets).sort_by &:date


@current_user_doweets = current_user.doweets.limit(10)
@friendships = Friendship.where(:friend_id => current_user.id, :status => true)
@friends = User.includes(:doweets).find_all_by_id(@friendships.collect(&:user_id))
@friends_doweets = @friends.collect(&:doweets).flatten
@doweets = (@current_user_doweets + @friends_doweets).sort_by &:created_at