9

我正在使用 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

是否有可能/建议这样做?如果是这样,我该如何/应该继续?


我想使用这种方法来避免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_namejoining_table_name

4

1 回答 1

-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
于 2012-06-27T13:23:46.463 回答