如果布尔值为true,则为Rails Association

Tim*_*ele 2 ruby if-statement ruby-on-rails associations conditional-statements

我有两个模型,一个用户模型和一个课程模型

用户架构如下所示:

create_table "users", force: true do |t|
    t.string   "username",                        default: "",    null: false
    t.string   "first_name",                      default: "",    null: false
    t.string   "last_name",                       default: "",    null: false
    t.string   "password_digest",                 default: "",    null: false
    t.string   "email",                           default: "",    null: false
    t.string   "email_unconfirmed",               default: "",    null: false
    t.string   "email_verification_token",        default: "",    null: false
    t.string   "password_reset_token",            default: "",    null: false
    t.datetime "password_reset_token_expires_at"
    t.boolean  "admin",                           default: false
    t.boolean  "teacher",                         default: false
    t.datetime "created_at"
    t.datetime "updated_at"
end
Run Code Online (Sandbox Code Playgroud)

课程架构如下所示:

create_table "courses", force: true do |t|
    t.integer  "teacher_id"
    t.string   "name"
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
end
Run Code Online (Sandbox Code Playgroud)

而用户模型:

class User < ActiveRecord::Base
    has_many :taught_courses, :foreign_key => :teacher_id 
end
Run Code Online (Sandbox Code Playgroud)

我只希望让用户在教师/管理员布尔是truetaught_courses ,但据我所知,如果语句,您可以不换在联想,引起老师?/管理?方法不可用所以我该如何处理?

Ric*_*eck 6

我想你可以这样做:

class User < ActiveRecord::Base
    has_many :taught_courses, -> { where(admin: true, teacher: true)}, :foreign_key => :teacher_id 
end
Run Code Online (Sandbox Code Playgroud)

您可以在线阅读有关ActiveRecord条件关联的更多信息,并在此处查看示例:

4.1.3.1 where

The where method lets you specify the conditions that the associated object must meet.

class Order < ActiveRecord::Base
  belongs_to :customer, -> { where active: true }
end
Run Code Online (Sandbox Code Playgroud)

更新

如果您打算使用其他模型进行验证,则可能需要使用.joins.但是,考虑到您正在ping原始模型,您可能希望使用ActiveRecord Association Extensions

这些使您可以访问proxy_association对象,这使您能够通过内存访问"父"数据:

class User < ActiveRecord::Base
    has_many :taught_courses, :foreign_key => :teacher_id do
        def admins_and_teachers
            user = proxy_association.owner
            where("users.admin = ? AND users.teacher = ?", user.admin, user.teacher)
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

我认为这会奏效; 如果没有,它肯定是我要看的路径