【问题标题】:Rails - Check if Parent model attribute is presentRails - 检查父模型属性是否存在
【发布时间】:2015-11-19 02:18:40
【问题描述】:

我想显示已将其帐户连接到我们的付款购买提供商的教师列表。当教师连接他们的付款帐户时,它会更新 User 模型上的付款 uid 字段。

我们的模型是这样设置的:

class User < ActiveRecord::Base
    has_one :teacher

class Teacher
    belongs_to :user

我的老师控制器:

class TeachersController < ApplicationController
    def index
        @teachers = Teacher.order('created_at DESC')
    end

我想显示如下内容:

@teachers = Teacher.where(self.user.uid.present?).order('created_at DESC')

但是我返回了一个 NoMethodError 'undefined method `user' for TeachersController'

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 associations nested-attributes


    【解决方案1】:

    试试:

    @teachers = Teacher.joins(:user).where.not('users.uid = ?',nil).order(created_at: :desc)
    

    valid_users = User.where.not(uid: nil).pluck(:id) # return array of all user's id which has not uid nil
    @teachers = Teacher.where(user_id: valid_users).order(created_at: :desc) 
    

    【讨论】:

    • 好吧,这个没有错误,但没有老师显示。
    • @donaldduck : 你检查数据库中的数据是否有任何相关数据可以满足这个条件?通过删除.not 进行检查并告诉我您仍然看不到任何结果?
    • @donaldduck :我已经用另一个选项更新了我的答案,它必须适合你
    【解决方案2】:

    假设您想要拥有用户的教师?

    @teachers = Teacher.where.not(user_id: nil).order(created_at: :desc)
    

    【讨论】:

    • 有点混乱,但uid是用户模型上的一个属性,我只想显示那些父用户的uid不为nil的老师。
    【解决方案3】:

    使用范围方法:

    class Teacher < ActiveRecord::Base
      ...
      def self.connected
        includes(:user).where.not(users: { uid: nil }).references(:user)
      end
      ...
    
    end
    

    你会像这样使用它:

    @teacher = Teacher.connected.order('created_at DESC')
    

    【讨论】:

    • 返回错误:“SQLException: no such column: user.uid”
    • 尝试复数用户:{ uid: nil }。我会更正答案。
    • @donaldduck :尝试从uid 中删除u,然后只写users: { id: nil }。看看它是否有效。
    • @BrentEicher 现在我收到了undefined method 'class_name' for nil:NilClass
    • 我很高兴将其转移到聊天中并帮助您调试程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2018-02-28
    相关资源
    最近更新 更多