我正在使用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
我想做类似以下的事情:
# 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
是否有可能/建议这样做?如果是这样,我该怎么做?
我想使用这种方法以避免multiple database table statements in INNER JOIN
of SQL queries(在某些情况下,它似乎使我的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
表。
答案 0 :(得分:-1)
方法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