如何根据没有特定值的关联进行查询?

时间:2016-12-29 10:58:13

标签: ruby-on-rails activerecord

假设我有2个型号:

class User
has_many :books
end

class Book
belongs to :user
end

让我们说这本书只有一个字段:标题。

如何查询没有标题书的用户" abc" ???

我尝试了以下内容:

User.left_outer_joins(:books).group("users.id, books.title").having("COUNT(books.title) = 0 or books.title != #{title}")

此查询的问题在于,如果用户有2本书(" abc"和" xyz"),它仍会返回它。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

试试吧

using System; //lib that allow you to use DateTime
...

[HttpPost][ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "pkID,projectID,languageID,projectCompany,projectTitle,projectLink,projectText,projectImageURL,isPassive,createDateTime,createUsername,updateDateTime,updateUsername")] cusContentProjects cusContentProjects)
{
    if (ModelState.IsValid)
    {
        db.cusContentProjects.Add(cusContentProjects);
        var date = DateTime.now; //save it wherever you need
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(cusContentProjects);
}

生成的查询可以在User.joins(:book).where("books.title !=?","#{title}") 中查看为

rails console

See the Documentation

答案 1 :(得分:0)

以下内容应该有效

User.joins(:books).group('books.user_id')
.having("SUM(IF(books.title = 'abc',1,0)) = ?", 0)

基本上只有用户拥有零书,标题为'abc'。

答案 2 :(得分:0)

也许最简单的方法是:

  • 使用书籍中的uniq标题

     <p th:text="${@mySession.getMessage()}"></p>
    
  • 没有书中的uniq标题

    book = Book.where(title: 'abc').first
    user_id = book.user.id
    User.where.not(id: user_id)
    
  • 如果你想做组和拥有,那么你需要一个像

    这样的SQL
    books = Book.where(title: 'abc')
    users_ids = books.map { |b| b.user.id }
    User.where.not(id: users_ids)
    

    与AR

    select  users.id, IF(title = 'abc',1,0) has_book
    from    users
            left join books b on user_id = users.id
    group by id
    having sum(has_book) = 0
    

我希望它有用:)