2011-08-15 68 views
0

我在一個名爲edit_privileges的rails應用程序中有一個關係表,其中User是「編輯器」,其他一些類是「可編輯的」。假設其中兩個類是MessageCommentRails中的多態關係表查詢 - 通過多個查找對象

EditPrivilege模型使用下面的代碼:

belongs_to :editor, :class_name => "User" 
belongs_to :editable, :polymorphic => true 

而且User,當然

has_many :edit_privileges, :foreign_key => "editor_id" 

的爲了確定用戶是否具有一定的模型編輯權限,我不能做正常的查詢:

user.edit_privileges.find_by_editable_id(@message.id) 

因爲如果用戶哈s編輯權限編輯與@message具有相同標識的註釋時,查詢將返回true,表中的編輯權限記錄錯誤。

於是,我試着做以下選項:

user.edit_privileges.find(:all, :conditions => ["editable_id = ? AND editable_type ?", @message.id, @message.class.to_s]) 
user.edit_privileges.where(:editable_id => @message.id, :editable_type => @message.class.to_s) 

其作品在尋找合適的戰績不錯,但(如果沒有編輯權限的空數組[])返回一個數組,而不是一個對象。如果我試圖創建一種方法來銷燬編輯權限,這尤其成問題,因爲您無法在數組上傳遞.destroy

我想追加.first到上述兩個解決方案返回的第一個對象和nil如果查詢的結果是空的,但這真的是最好的辦法嗎?這樣做有什麼問題嗎? (如,而不是使用動態的,基於屬性的發現者像find_by_editabe_id_and_editable_type

+1

[]是不是亂碼,但陣列。如果要對數組(集合)執行批處理操作,例如,如果要銷燬數組中的所有記錄,可以使用'users.map(&:destroy)'。 –

回答

3

使用find(:first, ...),而不是find(:all, ...)得到一條記錄(注意它可能返回零,同時發現將引發RecordNotFound除外)。因此,對於你的例子:

user.edit_privileges.find(:first, :conditions => { :editable_id => @message.id, :editable_type => @message.class.to_s }) 

順便說一句,如果你對更多的邊緣導軌版本(3.X),Model.where(...).first是新的語法:

user.edit_privileges.where(:editable_id => @message.id, :editable_type => @message.class.to_s).first 
+0

我認爲這是做到這一點的方法,但我不確定是否有另一種「最佳做法」,我應該知道,因爲從數組中取下第一條記錄對我來說似乎有點奇怪。 –

+0

有沒有一個原因,爲什麼這會更喜歡使用像'find_by_editabe_id_and_editable_type'這樣的基於動態屬性的發現者? –

+1

find_by_this_and_that很好,很好的動態方法,但是如果使用更多的條件,使用'where(...)。first'會更加靈活。 –