2013-03-20 56 views
1

我想知道我是否可以将default_scope放在if区块内。我有一个用户模型has_one配置文件。这是我在我的用户模型的代码:default_scope可以在if块内吗?

Class User 

default_scope joins(:profile).order('profiles.updated_at DESC').readonly(false) 

end 

的问题是,当数据库没有创建的配置它提供了一个错误,因为配置文件是零。我可以使用一个if块,我可以说:

unless self.profile.nil? 
default_scope joins(:profile).order('profiles.updated_at DESC').readonly(false) 
end 

这种方法是否有其他替代方法?

+0

这个问题不在'default_scope'中,它在你的代码中的其他地方。即使你在db中没有任何配置文件,也不应该导致任何错误。 – jvnill 2013-03-20 15:49:40

+0

作用域是在类级别 – apneadiving 2013-03-20 15:51:44

+0

好的,不管是否有任何配置文件在数据库或不。如果我在我的用户模型中有上述代码,它会与Devise发生冲突。具体设计可确定。确认后,它不会直接进入用户显示页面。我想我提供了足够的信息。但任何人遇到这个问题? – pratski 2013-03-20 16:28:40

回答

1

虽然我在你已经解决了你的问题的意见看,这里有一个答案,你实际上问的问题,万一别人遇到这种奇事:

从技术上说,是的,你可以把在if区块内呼叫default_scope但是,这个条件会被测试(并且default_scope应用与否)当这个类被加载时。当您启动应用程序时(或者在开发模式下发送请求时)。您将无法检查该类的特定实例的属性,因为该实例尚不存在。

简版:a default_scope将适用于基于模型的所有查询,或者不适用于所有查询。

0

我敢肯定,你可以做这样的事情:

default_scope lambda { 
    unless profile.nil? 
    joins(:profile).order('profiles.updated_at DESC').readonly(false) 
    end 
} 

下面是从spree_landlord项目an example