Ruby on rails Rails中的多态关系表查询&x2014 ;通过多次查找对象

Ruby on rails Rails中的多态关系表查询&x2014 ;通过多次查找对象,ruby-on-rails,table-relationships,Ruby On Rails,Table Relationships,我在rails应用程序中有一个名为edit\u privileges的关系表,其中User是“编辑器”,许多其他类是“可编辑的”。假设其中两个类是Message和Comment 我的EditPrivilege车型使用以下代码: belongs_to :editor, :class_name => "User" belongs_to :editable, :polymorphic => true 当然还有用户 has_many :edit_privileges, :foreign_k

我在rails应用程序中有一个名为
edit\u privileges
的关系表,其中
User
是“编辑器”,许多其他类是“可编辑的”。假设其中两个类是
Message
Comment

我的
EditPrivilege
车型使用以下代码:

belongs_to :editor, :class_name => "User"
belongs_to :editable, :polymorphic => true
当然还有
用户

has_many :edit_privileges, :foreign_key => "editor_id"
为了确定用户是否具有特定型号的编辑权限,我无法执行常规查询:

user.edit_privileges.find_by_editable_id(@message.id)
因为如果用户具有编辑权限来编辑与
@message
具有相同id的注释,则查询将返回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

我想,如果查询结果为空has,则将
.first
附加到上述两个解决方案后将返回第一个对象和
nil
,但这真的是最好的方法吗?这样做有什么问题吗?(例如,不要使用基于动态属性的查找程序,如
find\u by\u editabe\u id\u和

使用
find(:first,…)
而不是
find(:all,…)
来获取一条记录(注意,find可能返回nil,而find将引发RecordNotFound异常)。以你为例:

user.edit_privileges.find(:first, :conditions => { :editable_id => @message.id, :editable_type => @message.class.to_s })
顺便说一句,如果您使用的是更多edge rails版本(3.x),
Model。其中(…)。首先是新语法:

user.edit_privileges.where(:editable_id => @message.id, :editable_type => @message.class.to_s).first
使用
find(:first,…)
而不是
find(:all,…)
获取一条记录(注意,它可能返回nil,而find将引发RecordNotFound异常)。以你为例:

user.edit_privileges.find(:first, :conditions => { :editable_id => @message.id, :editable_type => @message.class.to_s })
顺便说一句,如果您使用的是更多edge rails版本(3.x),
Model。其中(…)。首先是新语法:

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

[]不是散列而是数组。如果要对数组(集合)执行批处理操作,例如,如果要销毁数组中的所有记录,可以使用
users.map(&:destroy)
[]不是散列而是数组。如果要对数组(集合)执行批处理操作,例如,如果要销毁数组中的所有记录,可以使用
users.map(&:destroy)
。我想这是一种方法,但我不确定是否有其他“最佳做法”值得注意,因为从数组中提取第一条记录对我来说似乎有点奇怪。有什么原因比使用基于动态属性的查找器(如
find\u by_editabe\u id\u和
)更可取?find\u by_this\u and_这是一种很好的动态方法,但使用
where(…).首先
更灵活,以防使用更多的条件。我认为这是解决问题的方法,但我不确定是否有其他我应该知道的“最佳实践”,因为从数组中提取第一条记录对我来说似乎有点奇怪。有什么原因比使用基于动态属性的查找器(如
find\u by_editabe\u id\u和
)更可取?find\u by_this\u and_这是一种很好的动态方法,但使用
where(…).第一个
更灵活,以防使用更多条件。