詢問兩個資料查詢的方式


#1

最近在做一些後台的設定工具 真的開始發現SQL的卡關

原本繞遠路用程式去做掉就算了 到最近 感覺越做越大越崩潰…

問題一

有多名成員 分別在各自的 role身分類別

role.id == 1  admin
role.id == 2  客服
role.id == 3  消費者
role.id == 4  問題戶

單獨查一名成員的身分就是用

user = User.find_by_id(4)
user.roles.first.id

但如果要查詢 所有的user 有哪些人是客服人員 該如何查詢??

如果直接對連接表進行查詢不知道可以可以

例如

UsersRole.where('role_id = ?', 2)

是可以撈到東西的 撈到 user_id

但直接對中間的連接表直接查詢不知道會不會有奇怪的問題產生或是危險疑慮??

.
.
.
.

問題二

SQL陣列的查詢 (這個我就不確知可不可以了…)

有個欄位資料 是陣列狀態 如 purview = [1,2,4,11,17]

如果是在ruby 裡面可以用程式的手法去判斷陣列內是否有 1 或是有沒有17

但是在SQL查詢 有辦法直接在查詢的過程就直接去判斷陣列當中是否有某個值 或是 那些筆資料的陣列有1 或是其他數字


#2

知道的不多~只能簡單回答一下
問題一:
不曉得這邊用 enum 解決會不會好一點? 這樣就不用再開 role 這張表了?

問題二:
不曉得你是用pg還是mysql?pg好像有類似 array 的type可以用


#3

回 Juin_Chiu

問題一:
請問是 https://github.com/dblock/ruby-enum

當中 Referencing 的那一種用法嗎??

藉由程式把所有相對應的訊息定義進去

就可以在其他頁面按個人需求去拉資料 大概意思吧!!??

問題二:
我是用mysql 我原本有嘗試用rails c 當中去試

有用 (‘includes in (?)’,2) 但是不對

有用like 搜尋1 (1 11 31) 都會中標 也不對

:sweat:


#4

hi

  1. 我是指這個~
    http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

  2. 如果該欄位的type 是 varchar,那陣列應該會被存成字串,所以可能要直接使用db提供的型別,或是直接用正規表達式去篩選


#5

抱歉,假日都在糜爛的研究自己的東西哈哈…

首先…其實你可以不用有關聯表,如果你的規則是有限定數量的

之後你可以再額外的定義類似每個 role 的適用範圍,類似

class User < ActiveRecord::Base #聽說要換成 ApplicationRecord 了
  ROLE_ROLE = [
    {:can_buy => true , :can_admin => false}, #0 guest
    {:can_buy => false , :can_admin => true}, #1 admin
  ]

這邊建議, 0 為初始值,給顧客使用,而 admin 用到很後面去,類似 9,因為

 "".to_i #=> 0

而以上,使用時請用類似

User::ROLE_ROLE[@user.role_kind][:can_buy] #=> true / false

或是在 user 身上加 method,類似

class User < ActiveRecord::Base
  def check_role(sym_kind)
    return User::ROLE_ROLE[self.role_kind][sym_kind]
  end
end
@user.check_role(:can_buy) #=> true / false

就這樣就好了,你可以少個關聯表少一次 SQL 時間,還很方便使用

而另外一方面,你不應該把 Admin(後台管理員) 和 User(一般消費者) 兩種身份弄在同一個 Table / Model 上面,你會造成你後續流程的浩劫,當然有『問題的消費者』是在『一般消費者』裡面沒錯就是,而『客服』應該算在『Admin』的身份的其中一種類型

我們新手教學 Youtbe 影片有教你打後台就是,怎樣弄出後台專用網址,怎樣弄出 Admin 身份,請照那邊來做唄,不然…你就繼續做下去唄,然後,用你的身體和時間來了解我的意思唄|||


#6

簡單的回一下

  1. 如果你的 role 是個 table,你用 role.users 就可以找出這個角色對應的人物了。完整寫法
role = Role.first # 撈出來應該是 user 或 admin 或是你設定的某個角色
role.users 
  1. 單純對中間表 select 不會對安全性造成影響,中間表只是為了多對多關連而必須設計的DB Schema 結構,如果你不修改他,sql 也下對,那當然是不會有什麼影響。

#7

想再另外詢問幾種情況

假如管理單位 也同時是使用者單位該如何處理

我在另外的練習案子裡頭

有一個是讓成員也同時身兼管理文章的權限,只有特定幾個人,

但如果這樣子把role分開寫,也是可以的嗎??

在標準商業架構的情形 是一般用戶 或是問題戶 或是vip 他們都會歸類為一般使用者

而客服 活動主辦單位 或是特別用途帳戶 他們本身不參與或使用網站內容及資源 完全做切割是完全可以理解的

在商業邏輯上這有單位明確分工

但如果是在使用者 卻同時也有部分人士擁有管理內容的權限 這樣子也是該分開製作嗎

ps 這些特定人就是多一個審核文章 或是管理文章去留的功能 不涉及金錢上的控管


#8

答案是請他註冊兩個帳號,一個是一般使用者,一個是管理者,兩個不同的登入入口,這是最基本的,請當做 spec 否則多說無益

最高權限的管理者可以從後台轉登至任何一個使用者,但不准執行 get 之外的動作即可(管理者不准幫使用者代操作,單純用來檢查使用者的 view 是否正確)這邊可以從 application_controller 內建檢查如果 current_user / current_manager 同時存在時,在 user dashboard 處建立 before_action 把 get 之外的 action 全部回傳 json(自訂格式,類似 :success => false )踢回去即可

再來別偷懶了,如果你前台有一頁,後台有超過四頁以上的管理介面都算正常(基本上都要算到四倍以上的量),管理員不應該還要跑到前台去做額外操作的


#9

好的 我再回去複習一下新手教學

看來又要大工程修改哩


#10

Rails 5 中是用 ApplicationRecord


#11

用得還不夠熟 X"DD … 有用過就是 … 主要專案都還是 Rails4 … 想不開再來升級|||


#12

我們在 beta 就開始用了,順便幫他 debug,心臟超大顆