Ruby on rails Rails中的多态关系表查询&x2014 ;通过多次查找对象
我在rails应用程序中有一个名为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
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(…).第一个
更灵活,以防使用更多条件。