Rails Rails 操作数据库,求大神解释一下下面这句代码

Cger007 · 2016年11月17日 · 最后由 realwol 回复于 2016年11月19日 · 1998 次阅读
操作数据库的一段代码,求大神帮忙讲解一下,Redmine 二次开发中的一个问题
def update_group
  cf = CustomField.find_by_name(params[:group_name])
  cid = cf.id unless cf.nil?
  if params[:flag].to_i == 1
    @groups = User.find(params[:uid]).groups.collect(&:lastname)
  else
    @groups = User.find(params[:uid]).groups.collect(&:id)
  end
  render :json => {:groups => @groups,:cid => cid}
end

先把代码排版好,参考:https://ruby-china.org/markdown

def update_group
  cf = CustomField.find_by_name(params[:group_name]) # 找到名字与 URL 参数 group_name 相同的一个 custom_field, 赋值给 cf
  cid = cf.id unless cf.nil? # 如果 cf 的值不是 nil ,就把 cf.id 赋值给 cid
  if params[:flag].to_i == 1 # 如果 URL 参数 flag 是 1 执行下一句
    @groups = User.find(params[:uid]).groups.collect(&:lastname) # 找到 id 与 URL 参数 uid 相同的用户,取出与这个用户相关联的 groups ,再把这些 groups 的 lastname 取出来列成一个数组,把这个由 lastname 组成的数组赋值给 @groups ,至于 group 为什么会有 lastname ......
  else # 如果 URL 参数的 flag 不是 1 执行下一句
    @groups = User.find(params[:uid]).groups.collect(&:id) # 找到 id 与 URL 参数 uid 相同的用户,取出与这个用户相关联的 groups ,再把这些 groups 的 id 取出来列成一个数组,把这个由 id 组成的数组赋值给 @groups 。
  end
  render :json => {:groups => @groups,:cid => cid} # 把 @groups 和 cid 以 json 格式渲染输出
end

三楼好赞

楼主不理解这段代码的哪部分?

#5 楼 @realwol 我主要不明白@groups = User.find(params[:uid]).groups.collect(&:lastname) 这句话,这是 sql 文?

注释写的没这么清楚了,哪里不懂

#7 楼 @Cger007 你拿出来单独执行,比如先 User.find(params[:uid]) 然后再执行 User.find(params[:uid]).groups 这样来看

这是 ruby 代码。 ruby 的这种代码,你分开一点一点看,前一个操作的返回值就是后一个操作的操作对象,你的这个句子中,是以 . 来区分的,所以就可以看作,先 find,再 groups,再 collect,那么 find 找到的结果是一条记录,对一个记录调用关联的 groups,结果就是这个对象关联的 groups 对象,完了再对整个 groups 做 collect 操作,取每个 group 的 lastname 字段,然后返回结果。 你可以按照这种方法,遇到不懂的关键词就去查一查,以后应该可以自己解决这些问题。

#10 楼 @realwol groups.collect 为什么可以这么用,这个东西查不到什么意思,这个和表的设计也有关系吧,我这里有 user 表对应的 Model 类也叫 User,有个 groups_users 表对应的 Model 类叫 Group。

  • has_and_belongs_to_many :users,
  • :join_table => "#{table_name_prefix}groups_users#{table_name_suffix}",
  • :after_add => :user_added,
  • :after_remove => :user_removed

  • acts_as_customizable rails 和 ruby 都是刚开始学的,问题可能描述不是那么准确,见谅~

这个 你可以去 guides看看,里边你这些问题都有答案。 还有,那个 groups_users 表应该是 user 和 group 的关系表。

#12 楼 @realwol 对,是有关系的,但是看不懂,比如说

  • :join_table => "#{table_name_prefix}groups_users#{table_name_suffix}",
  • 这句就没看懂"#{table_name_prefix}groups_users#{table_name_suffix}",表名前缀、表名后缀的,就是英语翻译过来的知道什么意思,具体为什么这么写,不懂啊~

这就是 rails 中的一个小门槛,约定,这种名字的规则 就是一个约定,没有强制的规定,也没有一个必要的原因,就是一个约定,如果大家都遵守,那么就会带来很多便利。不需要强行去找个理由解释他,记住就可以。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册