如何获取有效或免费试用用户的产品? (产品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)