Ruby on rails Rails4覆盖有许多getter方法

Ruby on rails Rails4覆盖有许多getter方法,ruby-on-rails,ruby-on-rails-4,overriding,has-many,eager-loading,Ruby On Rails,Ruby On Rails 4,Overriding,Has Many,Eager Loading,我有一个Rails 4.1.7应用程序,其中有用户和主题: class User < ActiveRecord::Base has_many :themes end class Theme < ActiveRecord::Base belongs_to :user end 但是,由于我想用用户来加载主题(包括(:主题)),所以这并不是真的 2) 使用一些范围(有很多:主题,->{where user\u id:nil}),但它会提供类似于的mySql查询。。。其中user

我有一个Rails 4.1.7应用程序,其中有
用户
主题

class User < ActiveRecord::Base
  has_many :themes
end

class Theme < ActiveRecord::Base
  belongs_to :user
end
但是,由于我想用用户来加载主题(
包括(:主题)
),所以这并不是真的


2) 使用一些范围(
有很多:主题,->{where user\u id:nil}
),但它会提供类似于
的mySql查询。。。其中user_id=123,user_id为NULL,返回空。我想我可以用Rails5做一些事情,比如说
有很多主题,{or.where user\u id:nil}
,但是现在改变Rails版本不是一个选项。

自从发布我的问题以来,我尝试了很多事情来实现我的目标。其中一个很有趣,我想值得一提:

我尝试使用or来取消对
有许多
关联的范围,结果如下:

has_many :themes, -> user = self { # EDIT: `= self` can even be omitted
  u_id = user.respond_to?(:id) ? user.id : user.ids

  unscope(where: :user_id).where(user_id: [u_id, nil])
  # or the same but with other syntax:
  rewhere(user_id: [u_id, nil])
}
当我尝试
@user.themes
时,它工作起来就像奇迹一样,并给出了以下mySql行:

SELECT `themes`.* FROM `themes`
       WHERE ((`themes`.`user_id` = 123 OR `themes`.`user_id` IS NULL))
但当我试图急切地加载它时(毕竟我为什么要开始我的研究),它只是拒绝取消查询范围,并给出了相同的
user\u id=123和user\u id=NULL

毕竟,@Ilya的评论和答案让我确信,使用
有许多
进行查询是一回事,但它还有其他方面,比如分配,为了自己的利益而覆盖它可能会破坏许多其他事情

所以我决定继续使用我的nice方法,只是我给了它一个更具体的名称,以避免将来的混淆:

def available_themes
  Theme.where user_id: [id, nil]
end

至于@AndreyDeineko的回答——因为他一直拒绝回答我的问题,总是回答一些从未被问过的问题——我仍然不明白为什么他的方法(与我的
可用主题相同,但使用3个额外的查询)会是一个更好的解决方案,为了实现我的目标,我尝试了很多事情。其中一个很有趣,我想值得一提:

我尝试使用or来取消对
有许多
关联的范围,结果如下:

has_many :themes, -> user = self { # EDIT: `= self` can even be omitted
  u_id = user.respond_to?(:id) ? user.id : user.ids

  unscope(where: :user_id).where(user_id: [u_id, nil])
  # or the same but with other syntax:
  rewhere(user_id: [u_id, nil])
}
当我尝试
@user.themes
时,它工作起来就像奇迹一样,并给出了以下mySql行:

SELECT `themes`.* FROM `themes`
       WHERE ((`themes`.`user_id` = 123 OR `themes`.`user_id` IS NULL))
但当我试图急切地加载它时(毕竟我为什么要开始我的研究),它只是拒绝取消查询范围,并给出了相同的
user\u id=123和user\u id=NULL

毕竟,@Ilya的评论和答案让我确信,使用
有许多
进行查询是一回事,但它还有其他方面,比如分配,为了自己的利益而覆盖它可能会破坏许多其他事情

所以我决定继续使用我的nice方法,只是我给了它一个更具体的名称,以避免将来的混淆:

def available_themes
  Theme.where user_id: [id, nil]
end

至于@AndreyDeineko的回答——因为他一直拒绝回答我的问题,总是回答一些从未被问过的问题——我仍然无法理解为什么他的方法(与我的
可用主题相同,但使用了3个额外的查询)将是一个更好的解决方案。

我认为重写关联是一个坏主意,因为
主题
没有指定任何用户实际上属于每个用户(多个用户),它不是一个
有一个-有多个
关系。我建议用另一种方法来实现你的目标。是的,这就是我现在使用的方法。只是,有时急切地加载它会更好…我认为重写关联是个坏主意,因为
主题
没有指定任何用户实际上属于每个用户(许多用户),它不是一个
有一个-有多个
关系。我建议用另一种方法来实现你的目标。是的,这就是我现在使用的方法。只是,有时候如果你能迫不及待地加载它会好得多。。。