Ruby On Rails ActiveRecord选择具有WHERE条件的东西

时间:2016-02-07 12:11:37

标签: ruby-on-rails ruby activerecord devise

我的应用程序中有PostUser个实体。

他们相应地拥有belongs_tohas_many关系。我使用gem devise作为用户授权/身份验证系统。

如果Postuser_id并且它与current_user.id相同,则此段代码会选择所有帖子,并将其分配给实例变量:

@post = Post.where(:user_id => current_user.id)

问题是:

我如何选择用户创建的最新帖子(我想我会使用.last方法来实现这一点)

但问题是我不知道如何在我的实例变量中的一个查询中使用.where.last

3 个答案:

答案 0 :(得分:2)

ActiveRecord where方法返回ActiveRecord关系对象。这意味着可以将其他AR方法链接到它上面。有几种方法可以做到这一点。

@post = Post.where(user: current_user)

请注意,您可以在不指定ID的情况下传递where对象。例如,where(user: current_user)而不是where(user_id: current_user.id)。 AR计算出你想要做的事情。

您也可以浏览用户。

@post = current_user.posts.last

但要注意last可能不一定按照你的意愿行事。它默认使用对象id。这意味着最近更新的帖子可能不会优先。如果您使用软删除,这也可能是一个问题。您可能希望明确地将created_atupdated_at添加到条件中。

@post = current_user.posts.order(created_at: :desc).last

您可能希望将其包装在范围内。

class Post
  scope :most_recent, -> { order(created_at: :desc).last }
end
@post = current_user.posts.most_recent

答案 1 :(得分:0)

您可以按升序或降序的顺序订购用户创建的帖子,以获取用户的最新帖子,您可以按降序排序。

在您的帖子模型中可以将范围定义为最近

#include <iostream>
using namespace std;
int a[10000000];
long int coin(long int n){
    if(n<10000000){
        return a[n];
    }
    else{
        return(max(n,coin(n/2)+coin(n/3)+coin(n/4)));
    }
}
int main()
{
    //cout << "Hello World!" << endl;
    long int n,ans;
    int i;
    a[0]=0;
    for(i=1;i<10000000;i++){
        a[i]=max(i,a[i/2]+a[i/3]+a[i/4]);
    }
    while(cin>>n){
        if(n<10000000){
            cout<<a[n]<<endl;
        }
        else{
            ans=coin(n);
            cout<<ans<<endl;
        }
    }
    return 0;
}

答案 2 :(得分:-2)

我已经解决了我的问题。

这对我来说就像一个魅力:

public class func filterDictionaryFromEmptyString(var dictionary:[String: AnyObject]) -> [String: AnyObject]
{
    print(dictionary.keys.count)
    for key:String in dictionary.keys
    {
        print(key)
        print(dictionary[key]!)
        if String(dictionary[key]!) == ""
        {
            dictionary.removeValueForKey(key)
        }
    }
    print(dictionary.keys.count)
    return dictionary
}