如何在activerecord has_many定义中获取primary_value的值?

时间:2016-07-04 12:50:33

标签: ruby-on-rails activerecord

# == Schema Information
#
# Table name: books
# id           :integer 
# owner_id     :integer

# Table name: users
# id           :integer
# name         :string

# Table name: shared_books_records
# user_id      :integer
# book_id      :integer

books
id: 1, owner_id: 1 # jack
id: 2, owner_id: 2 # tom
id: 3, owner_id: 1 # jack

users
id: 1, name: "jack"
id: 2, name: "tom"
杰克有两本书,汤姆有一本书。

shared_books_records
user_id: 1, book_id: 2

所以杰克借了汤姆的书。现在杰克应该有3本书。

class User
  def all_books
    join_sql = <<-SQL.squish!
      LEFT OUTER JOIN shared_books_records
        ON shared_books_records.user_id = books.assignee_id
    SQL
    condition = <<-SQL.squish!
       books.owner_id = :user_id OR 
       shared_books_records.user_id = user_id
    SQL

    Book.joins(join_sql).where(condition, user_id: id)
  end
end

我认为这不是很好,activerecord关联更好。所以我想重新定义它。

has_many :all_books, 
         -> { 
           primary_key_value = xxxx    # I want to get this value

           join_sql = <<-SQL.squish!
             LEFT OUTER JOIN shared_books_records
               ON shared_books_records.user_id = books.assignee_id
           SQL

           condition = <<-SQL.squish!
             books.owner_id = :user_id OR 
             shared_books_records.user_id = user_id
           SQL

           joins(join_sql).unscope(:where).where(condition, user_id: primary_key_value)
         }, 
         class_name: Book, foreign_key: :owner_id

但我不知道如何在范围内获得primary_key的价值。

我的解决方案

has_many :all_books, 
     -> (user) { 
       primary_key_value = user.id    # I want to get this value

       join_sql = <<-SQL.squish!
         LEFT OUTER JOIN shared_books_records
           ON shared_books_records.user_id = books.assignee_id
       SQL

       condition = <<-SQL.squish!
         books.owner_id = :user_id OR 
         shared_books_records.user_id = :user_id
       SQL

       joins(join_sql).unscope(:where).where(condition, user_id: primary_key_value)
     }, 
     class_name: Book, foreign_key: :owner_id

2 个答案:

答案 0 :(得分:0)

要获得所有书籍,您可以像这样做

class User
  has_many :user_books
  has_many :books, through: :user_books
end

class UserBook
  belongs_to :books
  belongs_to :users
end

class Book
  has_many :user_books
  has_many :users, through: :user_books
end

# Table name: books
# id           :integer 
# owner_id     :integer

# Table name: users
# id           :integer

# Table name: user_books (previously shared_books_record)
# user_id      :integer
# book_id      :integer


def all_ books
  #lets say id has value for user_id
  user = User.find(id)
  all_books = user.books #this should return an array of all books which belongs to the current user
end

答案 1 :(得分:0)

class User
  has_many :user_books
  has_many :books, through: :user_books
end

class UserBook
  belongs_to :books
  belongs_to :users
end

class Book
  has_many :user_books
  has_many :users, through: :user_books
end