如何获取有效或免费试用用户的产品? (产品belongs_to用户)

User has_many products Product belongs_to user 

用户的表中还有一个active_account和created_at列。

我试图将其转换为查询:

“产品所属的用户拥有活动帐户或者不到25天的产品是什么?”

这是我到目前为止(不知道如何添加OR不到25天):

 Product.joins(:user).where(users: {active_account: true}) 

更好的方法是使用Arel

 users = Arel::Table.new(:users) products = Arel::Table.new(:products) users .join(products,Arel::Nodes::InnerJoin) .on(users[:id].eq(products[:user_id])) .where(users[:active_account].eq(true).or(users[:created_at].lt(25.days.ago)) 

我会从这样的事情开始:

 Product.joins(:user).where( "users.active_account = :account_active OR users.created_at >= :max_age", { :account_active => true, :max_age => 25.days.ago } ) 

在下一步中,我将该逻辑移动到范围并合并该范围:

 # in user.rb scope :active, ->{ where("users.active_account = :account_active OR users.created_at >= :max_age", { :account_active => true, :max_age => 25.days.ago }) } # in product.rb scope :with_active_user, ->{ joins(:user).merge(User.active) } 

什么允许你像这样使用它:

 Product.with_active_user 

试试这个:

  Product.joins(:user).where("users.active_account = ? OR users.created_at >= '#{(Time.now - 25.days).utc.iso8601}'", true)