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)
我只希望让用户在教师/管理员布尔是true
有taught_courses
,但据我所知,如果语句,您可以不换在联想,引起老师?/管理?方法不可用所以我该如何处理?
我想你可以这样做:
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)
我认为这会奏效; 如果没有,它肯定是我要看的路径
归档时间: |
|
查看次数: |
801 次 |
最近记录: |