use*_*882 7 ruby conditional join ruby-on-rails ruby-on-rails-3
我正在使用Ruby on Rails 3.2.2,我想知道是否在范围方法中,只有当该表尚未连接时才能"动态"连接表.它,我有:
def self.scope_method_name(user)
joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id)
end
Run Code Online (Sandbox Code Playgroud)
我想做类似以下的事情:
# Note: the following code is just a sample in order to understand what I mean.
def self.scope_method_name(user)
if table_is_joined?(joining_table_name)
where("joining_table_name.user_id = ?", user.id)
else
joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id)
end
end
Run Code Online (Sandbox Code Playgroud)
是否有可能/建议这样做?如果是这样,我该怎么做?
我想使用这种方法,以避免SQL查询中INNER JOIN的多个数据库表语句(在某些情况下,它似乎使我的SQL查询不能按预期工作,因为多个表语句),所以使用scope_method_name不关心相关的SQL查询问题(就我而言,没有关心加入数据库表).
注:它可以提高SQL错误(例如,错误,样" ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'joining_table_name.user_id' in 'where clause'"),当你有没有加入尚未数据库表(例如,这可能当你喜欢上运行的代码发生ClassName.scope_method_name(@user) 没有以前加入的joining_association_name,因此没有加入相关joining_table_name表).
spa*_*pas -2
loaded?检查关联是否已加载的方法在哪里。你可以尝试使用它。
if association_name.loaded?
where("joining_table_name.user_id = ?", user.id)
else
joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id)
end
Run Code Online (Sandbox Code Playgroud)